Amazon S3 上传问题 Android SDK、com.amazonaws.AmazonClientException:读取的数据 (4567265) 多于预期 (4561427)

Posted

技术标签:

【中文标题】Amazon S3 上传问题 Android SDK、com.amazonaws.AmazonClientException:读取的数据 (4567265) 多于预期 (4561427)【英文标题】:Amazon S3 Upload issue Android SDK, com.amazonaws.AmazonClientException: More data read (4567265) than expected (4561427) 【发布时间】:2018-08-30 03:16:01 【问题描述】:

当我使用 amazon s3 SDK 从 Nexus 6 上传文件时,它会抛出 com.amazonaws.AmazonClientException: More data read (4567265) than expected (4561427) 异常。

但是当我使用相同的代码从 Moto G4 上传图片时,它每次都会上传。

请帮我解决这个问题。

这是我的参考代码:

 private void uploadingScreenshot(String filePath) 
    
        File file = new File(filePath);
        if (file.exists()) 
            final String serverPath = S3Util.getMediaPath(Utility.MediaType.SCREENSHOT, false, "");
            ObjectMetadata meta = new ObjectMetadata();
            meta.setContentLength(file.length());
            S3Util.uploadMedia(SharedFolderDetailActivity.this, file, serverPath, meta, new TransferListener() 
                @Override
                public void onStateChanged(int id, TransferState state) 
                    switch (state) 
                        case COMPLETED: 
                            String path = S3Constants.BUCKET_URL + serverPath;
                            callTookScreenshotNotifierWS(path);
                        
                        break;
                    
                

                @Override
                public void onProgressChanged(int id, long bytesCurrent, long bytesTotal) 

                

                @Override
                public void onError(int id, Exception ex) 
                    if (ex != null)
                        Log.e(TAG, ex.getMessage());
                
            );
        
    

该函数用于在amazon s3服务器上上传文件。

 public class S3Util 

        public static TransferObserver uploadMedia(final Context context, File file, String s3Path, ObjectMetadata objectMetadata, TransferListener l) 
            TransferObserver observer = getTransferUtility(context).upload(S3Constants.BUCKET_NAME, s3Path, file,objectMetadata);
            observer.setTransferListener(l);
            return observer;
        
    

【问题讨论】:

//亚马逊s3服务器sdk实现“com.amazonaws:aws-android-sdk-s3:2.6.+” 尝试创建文件的副本,然后阅读它,看看是否有帮助。还可以尝试在阅读之前锁定文件,看看是否有帮助? dzone.com/articles/locking-files-in-java。可能是上传文件时开头和结尾的内容不同 我曾经在上传文件的同时重写文件时遇到了同样的错误。 这很可能是由@Nathanael 描述的情况引起的。我建议如果可能的话,如果是定期上传,每个时间段一个文件,则对文件进行分区。如果上传不是定期的,那么您可以运行一个线程来检查文件大小,然后每隔几秒钟检查一次文件大小,直到两个连续的大小相等。这并不能保证成功,但如果文件没有无限期地在 S3 上更新,它应该会显着降低错误率。 【参考方案1】:

试试这个答案AmazonClientException: Data read has a different length than the expected

我之前也遇到过这个问题, 希望对你有帮助

【讨论】:

【参考方案2】:

我的看法是,aws-sdk 和 android sdk 存在兼容性问题。最好的方法是尝试降级您的 aws-version 并使用您的 android sdk 找出更稳定的版本。也许我错了。。

另外,我建议你在https://github.com/aws/aws-sdk-android/issues写问题

我希望你能解决你的问题。祝你好运!)

【讨论】:

以上是关于Amazon S3 上传问题 Android SDK、com.amazonaws.AmazonClientException:读取的数据 (4567265) 多于预期 (4561427)的主要内容,如果未能解决你的问题,请参考以下文章

将图像从 Android 上传到 Amazon S3?

Amazon S3 上传问题 Android SDK、com.amazonaws.AmazonClientException:读取的数据 (4567265) 多于预期 (4561427)

如何在不使用 SDK 的情况下将文件从 Android 上传到 Amazon S3

Amazon S3 上传访问被拒绝

Amazon Cloud Drive 的任何 API,Amazon S3 Android 除外

使用 plupload 和 Rails 3 的 Amazon S3 分段上传