【发布时间】:2013-02-08 14:17:14
【问题描述】:
我的 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 开发工具包团队的)前来帮助我。如果您使用某些方法,重要的信息确实可以作为 AmazonS3Exception 的属性使用。文档最初让我感到困惑,我认为需要手动 Thread.sleep() 循环来轮询状态(因此我无法利用 waitForCompletion 或 waitForException),但如果您在 PutObjectRequest 上使用 ProgressListener,您可以获得完整的进度回调和AmazonS3Exception 的错误保真度。
【问题讨论】:
-
您似乎使用的是
TransferManager,而不是低级别的AmazonS3Client。你应该在你的问题中清楚地提到这一点。低级客户端抛出包含errorCode和statusCode的AmazonServiceException。此外,您使用适用于 Java 的 AWS 开发工具包而不是适用于 Android 的 AWS 开发工具包有什么特别的原因吗? -
嗨@YosukeMatsuda - 感谢您的回复。是的,我的错,我实际上使用的是适用于 Android 的 AWS (Java) SDK。让我快速浏览一下 AmazonS3Client...
-
@YosukeMatsuda 查看 AmazonS3Client,是否可以使用此 API 获取传输进度?我用它在上传过程中向我的用户显示一个进度对话框,这很关键,因为我的许多用户的无线连接很差,并且状态/进度/带宽的一些指示确实有帮助......在确切的权衡中是否有一个好的文档在 AmazonS3Client 和 TransferManager 之间?
-
您可以通过ProgressListener获取进度反馈。总的来说,
TransferManager比较好用,有利于高效上传大量大文件;它会自动对大文件使用分段上传。另一方面,AmazonS3Client为您提供更多控制权,但您需要进行更多编码。另外,you can fetch the AWS server time using Amazon Route 53. -
我们刚刚发布了一个new version of the AWS SDK for Android,它能够处理设备时钟偏差。当您确定设备时钟过于倾斜时,您可能需要使用此功能。
标签: android amazon-web-services amazon-s3