3

我的 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 的错误保真度。

4

2 回答 2

5

这两种方法应该可以帮助您:

如果您根据传输进度事件检测到您的传输失败,您可以简单地调用 Transfer.waitForException() 以返回发生的异常。在这种情况下,该异常将是 AmazonServiceException,其中包含您需要查看的所有信息,以了解真正的问题是时钟偏差问题。

或者,该Transfer.waitForCompletion()方法将从 ExecutionException 中解开原始异常并直接抛出原始异常,就好像这一切都发生在一个线程上一样。如果您想使用 catch 块干净、优雅地捕获不同类型的错误,这可能是一种更方便的方法。

我不同意“catch Exception”块“非常广泛”。该代码的重点是捕获发生的任何错误,将传输标记为失败并重新抛出错误,以便应用程序代码知道它。如果它不那么广泛,那么正是异常可能潜入并且传输进度不会正确更新并且与现实不同步的情况。

给出这两种方法并拍摄,如果有帮助,请告诉我们!

于 2013-02-23T01:09:40.990 回答
1

好吧,我已经调试了亚马逊的 SDK,我很遗憾地说这些信息正在被内部吞噬。也许我会尝试提交一个补丁。

详细信息:内部抛出了一个 AmazonS3Exception,它实际上准确地报告了这个确切的错误场景,但是一个粗暴的 try catch (Exception e) 消耗了它并洗掉了特殊性。

这是有罪的尝试捕获:

https://github.com/aws/aws-sdk-java/blob/master/src/main/java/com/amazonaws/services/s3/transfer/internal/UploadMonitor.java#L145

这是一个屏幕截图,显示 AmazonS3Exception 使用正确的信息正确抛出......

调试截图

于 2013-02-23T00:13:15.413 回答