环境准备
- 使用 Java 1.8 及以上版本。
- 查看版本
执行命令java -version查看Java版本。 - 已知
JAVA SDK 无法获取 OSS 返回的 http header 和 http code,都被 SDK 封装;判断上传成功的标准是没有异常抛出,并且返回的 requestID 不为空;
下载SDK
- 直接通过 GitHub 下载
- 安装SDK,在Maven项目中加入依赖项(推荐方式)
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>2.8.3</version>
</dependency>
初始化的参数设置
弱网的环境下最好将超时时间设置长一些,增加重试次数,避免上传失败。
// 创建ClientConfiguration。ClientConfiguration是OSSClient的配置类,可配置代理、连接超时、最大连接数等参数。
ClientConfiguration conf = new ClientConfiguration();
// 设置OSSClient允许打开的最大HTTP连接数,默认为1024个。
conf.setMaxConnections(2048);
// 设置Socket层传输数据的超时时间,默认为50000毫秒。
conf.setSocketTimeout(10000);
// 设置建立连接的超时时间,默认为50000毫秒。
conf.setConnectionTimeout(10000);
// 设置从连接池中获取连接的超时时间(单位:毫秒),默认不超时。
conf.setConnectionRequestTimeout(1000);
// 设置连接空闲超时时间。超时则关闭连接,默认为60000毫秒。
conf.setIdleConnectionTime(10000);
// 设置失败请求重试次数,默认为3次。
conf.setMaxErrorRetry(5);
使用遇到问题
下文结合一些常见的使用案例说下注意问题,案例不定期补充,所有用户数据信息已经处理过。
案例:请求出现异常 “SDK.ServerUnreachable : Speicified endpoint or uri is not valid”
分析:
出现这种问题意思是用户没有连接到阿里云网关,一般和一下几个原因有关系:
- 用户端的代码中并发请求 STS 过高,而用户端的 ECS 或者本地 PC 不足以承载当时的并发导致,降低 OSS 并发。
- 用户的网络到 server 端有超时现象可以进行抓包验证。
- 用户的 STS SDK 版本以及 SDK core 版本不是最新导致。更换到新版 SDK 测试一下
案例:NoSuchKey
case:java.lang.Exception: com.aliyun.oss.OSSException:
Not Foundn[ErrorCode]: NoSuchKeyn
java SDK 出现这种问题,就是源文件不存在,可以参考排查系列中的 404 问题排查。
案例:socketException
分析:
可以明显看到错误是 socket 异常了,这可能是 socket 在 init 阶段就失败了,请求都没有到 OSS ,建议客户端检查下:
- 当时的网络是否出现抖动。
- 主机的 socket 连接数是否占满。
- SDK 中设置的 maxconnection 是多大,如果当时链接数超过
maxconnection 设置,也会出现 socket 异常。 - 如果以上没有没有问题,只能让用户部署 tcpdump 或者 wireshark 抓包,然后复现问题后,分下数据包。
案例:PostObject 没有回调
使用OSS PostObject的callback没有发生回调。但是通过 putobject 用同样的 callback 是有回调发生的,怀疑 PostObject 有问题?
分别测试 PUT 和 POST 效果如下,PUT 触发了回调,POST 没有触发回调。
按理说,如果json格式有错误或者回调失败,都应该会返回对应的msg,而上传后一切成功但为什么没有发生回调呢 ?
分析:
- 检查到在发送请求时callback的参数是在 file 下面。
- 修改为,调整一下位置,这样就会作为file的一部分。
- 测试结果成功,业务服务器上也如愿的抓到了请求
案例:Java 结合 web 实现通过 STS 上传 OSS
如果出现如下报错,可能和跨域或者代码中配置的 OSS 信息有关,可以按照如下思路处理。
分析:
如果是使用 java 的代码,可以看下
- 服务端生成上传信息时 host 和 bucket 是否填写正确。
- 是否对 OSS 配置了跨域文件。