android - AWS S3 Java SDK : detect time/clock skew programmatically?

标签 android amazon-web-services amazon-s3

我的 Android 应用程序使用 AWS Java SDK 将用户照片上传到 S3。

只要用户手机的时钟“倾斜”,就会导致所有传输失败。这是 S3 的一个有据可查的方面:

http://aws.amazon.com/articles/1109?_encoding=UTF8&jiveRedirect=1#04

看起来上游S3服务很清楚地报告了这个错误:

HTTP Status Code: 403 Forbidden

Error Code: RequestTimeToo-Skewed

Description: The difference between the request time and the server's time is too large.

然而,当使用 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 SDK(它看起来与 Java SDK 非常相似,但仍然不同)
  • 我正在使用 TransferManager 类来执行上传。显然,这是一个包装了较低级别的 AmazonS3Client 的高级类......并且这个较低级别的类应该公开我需要的错误报告,但我仍在调查 TransferManager 和 AmazonS3Client 之间涉及的确切权衡。据我所知,无法通过(同步)AmazonS3Client.putObjectRequest 获取进度信息,这对我来说是个障碍...

更新#2: 衷心感谢 Jason(来自 AWS SDK 团队)来这里帮助我。如果您使用某些方法,重要信息确实可以作为 AmazonS3Exception 的属性使用。文档最初让我感到困惑,我认为轮询状态需要手动 Thread.sleep() 循环(因此我无法利用 waitForCompletion 或 waitForException),但如果您在 PutObjectRequest 上使用 ProgressListener,您可以获得完整的进度回调和AmazonS3Exception 的错误保真度。

最佳答案

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

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

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

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

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

关于android - AWS S3 Java SDK : detect time/clock skew programmatically?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033064/

相关文章:

android - 使用 aar 在 Android Studio 上将 Git 库与项目包含在一起?

android - 3行后在TextView末尾添加 "View More"

amazon-web-services - 如何解决 AWS CloudFormation 不一致的属性 AttributeDefinitions?

amazon-web-services - Amazon VPC NACL默认规则评估顺序

amazon-web-services - Boto3 - 创建 S3 'object created' 通知以触发 lambda 函数

android - ICS 4.0.3 上的 USB 主机模式 - 我错过了什么?

java.lang.NoSuchMethodError : No static method combineMeasuredStates(II)I in class 错误

php - 调用 S3Client::setRegion() 失败

amazon-web-services - 如何将 aws 私有(private)存储桶复制到 azure 存储

elasticsearch - 将Amazon S3存储库添加到ElasticSearch时如何解决 “Error injecting constructor”问题?