我的 Android 应用程序使用 AWS Java SDK 将用户照片上传到 S3。
每当用户手机的时钟“倾斜”时,都会导致所有传输失败。这是 S3 的一个有据可查的方面:
http://aws.amazon.com/articles/1109?_encoding=UTF8&jiveRedirect=1#04
上游 S3 服务似乎很清楚地报告了这个错误:
HTTP 状态码:403 禁止
错误代码:RequestTimeToo-Skewed
说明:请求时间与服务端时间相差过大。
但是,在使用 Java SDK 时,似乎信息丰富的 403 代码丢失了......而且我只有一个不透明的“TransferState.Failed”可以通过(顺便说一下,如果互联网连接丢失,这也是同样的错误,如果它时间出等...)。
据我从文档中可以看出:
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/TransferProgress .html http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/transfer/Transfer.TransferState.html http://docs.aws.amazon.com/AWSJavaSDK/latest /javadoc/com/amazonaws/services/s3/transfer/Upload.html
无法获取有关传输失败的附加“RequestTimeToo-Skewed”元数据。
我错过了吗?当使用 Amazon 的 Java SDK 进行 S3 传输失败时,是否有任何方法可以获取额外的错误信息?
更新#1: 一位评论者亲切地强调我应该澄清两点:
- 我实际上正在使用适用于 Android 的 AWS 开发工具包(它看起来与 Java 开发工具包非常相似,但仍然不同)
- 我正在使用 TransferManager 类来执行我的上传。显然,这是一个包装了较低级别 AmazonS3Client 的高级类......并且这个较低级别的类应该公开我需要的错误报告,但我仍在调查 TransferManager 和 AmazonS3Client 之间所涉及的确切权衡。据我所知,没有办法通过(同步)AmazonS3Client.putObjectRequest 获取进度信息,这对我来说是一个障碍......
更新 #2: 我衷心感谢 Jason(AWS SDK 团队的)在这里停下来帮助我。如果您使用某些方法,重要的信息确实可以作为 AmazonS3Exception 上的属性使用。文档最初让我感到困惑,我认为需要手动 Thread.sleep() 循环来轮询状态(因此我无法利用 waitForCompletion 或 waitForException),但如果您在 PutObjectRequest 上使用 ProgressListener,您可以获得完整的进度回调和AmazonS3Exception 的错误保真度。