【问题标题】:AmazonClientException: More data read than expectedAmazonClientException:读取的数据多于预期
【发布时间】:2020-05-20 09:36:20
【问题描述】:

当我尝试将对象添加到 s3 时,它会给出AmazonClientException: Data read has a different length than the expected

但问题是预期长度显示比实际大小大 32 位。

例如:5076681 字节是磁盘上的实际大小。但是我们得到一个例外,说预期为 5076713。

 HttpURLConnection connection = (HttpURLConnection) url.openConnection();
        InputStream in = connection.getInputStream();
        ObjectMetadata metadata = new ObjectMetadata();
        //adding metadata content length along with request
        metadata.setContentLength(contentLengthParam);
        PutObjectRequest putObjectRequest = new PutObjectRequest("Bucket", "fileName", in, metadata)
                .withCannedAcl(CannedAccessControlList.PublicRead);
        PutObjectResult result = s3AwsClient.putObject(putObjectRequest);

我得到的例外:

com.amazonaws.AmazonClientException: More data read than expected: dataLength=5076713; expectedLength=5076681; includeSkipped=false; in.getClass()=class com.amazonaws.internal.ReleasableInputStream; markedSupported=false; marked=0; resetSinceLastMarked=false; markCount=0; resetCount=0
com.amazonaws.util.LengthCheckInputStream.checkLength(LengthCheckInputStream.java:156)
com.amazonaws.util.LengthCheckInputStream.read(LengthCheckInputStream.java:110)
com.amazonaws.internal.SdkFilterInputStream.read(SdkFilterInputStream.java:72)
com.amazonaws.services.s3.internal.MD5DigestCalculatingInputStream.read(MD5DigestCalculatingInputStream.java:98)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
    at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-java-sdk


    【解决方案1】:

    这只是意味着您的HttpURLConnection 的输入流中的数据比contentLengthParam 多。您可以做的是将连接输入流中的所有内容读取到缓冲区中,计算其长度,然后将该缓冲区写入 S3。

    【讨论】:

    • 嗨@madhead,谢谢你的建议,但我实际上是在寻找原因。经过进一步调查,我发现它只发生在大于 4mb 的文件中。
    【解决方案2】:

    我(曾经)在我的 Android 应用程序上上传 AWS S3 时遇到了同样的问题。该问题只会发生在某些用户身上,我无法弄清楚如何重现该问题。在玩了一会儿之后,我相信我能够可靠地重现问题并修复它......我注意到我可能会在用相机拍照后尝试上传文件过快来触发错误。我相信我已经通过添加一个新的 Handler().postDelayed() (我使用了 3s)调用解决了这个问题,然后我在其中上传了我的照片。从那以后一直无法重现该问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-04
      • 2019-04-02
      • 1970-01-01
      • 2018-11-05
      • 2018-08-30
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多