一,问题描述
使用阿里云OSS上传文件时报错如下所示:
补充:
这个问题只在bucket地域为香港才会出现,正常地域为内地的比如北京是不会出现上面的问题。
二,解决过程
先说结论:是因为本机代理ip和端口没有配置的原因造成香港地区oss访问超时。
接口代码如下:
@RestController
@RequestMapping("/files")
public class UploadController {
@PostMapping("/imageUpload")
public Result<String> upload( MultipartFile file) {
System.out.println(file);
try{
//把文件内容传递到本地磁盘中
String originalFilename = file.getOriginalFilename();
//保证名字是唯一的,防止文件覆盖
String filename=UUID.randomUUID().toString()+ originalFilename.substring(originalFilename.lastIndexOf("."));
String url = AliOssUtil.uploadFile(filename, file.getInputStream());
return Result.success("上传成功",url);
}catch (Exception e){
System.out.println(e);
return Result.error("上传失败");
}
}
}
工具类代码如下:
问题原因就在代码注释的地方
package com.wsn.smartofficeserver.utils;
import com.aliyun.oss.*;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import java.io.InputStream;
public class AliOssUtil {
private static final String ENDPOINT = "oss-cn-hongkong.aliyuncs.com";
private static final String OSS_ACCESS_KEY_ID = "填自己的OSS_ACCESS_KEY_ID ";
private static final String OSS_ACCESS_KEY_SECRET = "填自己的OSS_ACCESS_KEY_SECRET ";
private static final String BUCKT_NAME = "填自己的BUCKT_NAME ";
//1.声明配置静态常量configuration
private static final ClientBuilderConfiguration configuration = new ClientBuilderConfiguration();
public static String uploadFile(String objectName, InputStream in) throws Exception {
//2.配置本机代理IP(如果不知道怎么找,看本文下面),如果是公司那么就按照公司代理配置
configuration.setProxyHost("0.0.0.0");
//3.配置本机代理端口(如果不知道怎么找,看本文下面),如果是公司那么就按照公司代理配置
configuration.setProxyPort(4780);
//4.将配置传入build
OSS ossClient = new OSSClientBuilder().build(ENDPOINT,OSS_ACCESS_KEY_ID,OSS_ACCESS_KEY_SECRET,configuration);
String url="";
try {
PutObjectRequest putObjectRequest = new PutObjectRequest(BUCKT_NAME, objectName, in);
PutObjectResult result = ossClient.putObject(putObjectRequest);
url="https://"+BUCKT_NAME+"."+ENDPOINT.substring(ENDPOINT.lastIndexOf("/")+1)+"/"+objectName;
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return url;
}
}
补充:如何查看本机代理端口和ip
1、打开自己的代理工具查看代理端口
2、打开cmd运行
netstat -ano
3.将上面的本机地址ip和端口填入到代码注释对应处,即可。重新运行,postman测试成功。