An exception “The Content-MD5 you specified did not match what we received”

匿名 (未验证) 提交于 2019-12-03 00:48:01

问题:

I got an exception, I never got before when testing my application that uploads a file from ec2 to s3. The content is:

Exception in thread "Thread-1" com.amazonaws.services.s3.model.AmazonS3Exception: The Content-MD5 you specified did not match what we received. (Service: Amazon S3; Status Code: 400; Error Code: BadDigest; Request ID: 972CB8E04388AB20), S3 Extended Request ID: T7bmFnQ2RlGWlJD+aGYfTy97XZw88pbQrwNB8YCezSjyq6O2joxHRP/6ko+Q2zZeGewkw4x/90k=     at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:1383)     at com.amazonaws.http.AmazonHttpClient.executeOneRequest(AmazonHttpClient.java:902)     at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:607)     at com.amazonaws.http.AmazonHttpClient.doExecute(AmazonHttpClient.java:376)     at com.amazonaws.http.AmazonHttpClient.executeWithTimer(AmazonHttpClient.java:338)     at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:287)     at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3676)     at com.amazonaws.services.s3.AmazonS3Client.putObject(AmazonS3Client.java:1439)     at com.amazonaws.services.s3.transfer.internal.UploadCallable.uploadInOneChunk(UploadCallable.java:131)     at com.amazonaws.services.s3.transfer.internal.UploadCallable.call(UploadCallable.java:123)     at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:139)     at com.amazonaws.services.s3.transfer.internal.UploadMonitor.call(UploadMonitor.java:47)     at java.util.concurrent.FutureTask.run(FutureTask.java:266)     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)     at java.lang.Thread.run(Thread.java:745) 

What can I do to fix this bug? I used the same code as before in my application.

回答1:

I think I have solved my problem. I finally found that some of my files actually changed during the uploading. Because the file is generated by another thread, the uploading and generating is done at the same time. The file can not be generated immediately, and during the generating of a file, it may be uploading at the same time, the file actually changed during the uploading.

The md5 of file is created at the beginning of uploading by the AmazonS3Client, then the whole file is uploaded to the S3, at this time, the file is different from the file uploaded at beginning, so the md5 actually changed. I modified my program to a single-threading program, and the problem never turned up again.



回答2:

Another reason for having this issue is to run a code such as this (python)

with open(filename, 'r') as fd:      self._bucket1.put_object(Key=key, Body=fd)      self._bucket2.put_object(Key=key, Body=fd) 

In this case the file object (fd) is pointing to the end of the file when it reaches line 3, so we will get the "Content MD5" error, in order to avoid it we will need to point the file reader back to the start position in the file

with open(filename, 'r') as fd:      bucket1.put_object(Key=key, Body=fd)      fd.seek(0)      bucket2.put_object(Key=key, Body=fd) 

This way we won't get the aforementioned Boto error.



回答3:

I also ran into this error when I was doing something like this:

InputStream productInputStream = convertImageFileToInputStream(file);  InputStream thumbnailInputStream = generateThumbnail(productInputStream);  String uploadedFileUrl = amazonS3Uploader.uploadToS3(BUCKET_PRODUCTS_IMAGES, productFilename, productInputStream);  String uploadedThumbnailUrl = amazonS3Uploader.uploadToS3(BUCKET_PRODUCTS_IMAGES, productThumbnailFilename, thumbnailInputStream); 

The generateThumbnail method was manipulating the productInputStream using a third party library. Because I couldn't modify the third party library, I simply performed the upload first:

InputStream productInputStream = convertImageFileToInputStream(file);  // do this first...  String uploadedFileUrl = amazonS3Uploader.uploadToS3(BUCKET_PRODUCTS_IMAGES, productFilename, productInputStream);  /// and then this... InputStream thumbnailInputStream = generateThumbnail(productInputStream);  String uploadedThumbnailUrl = amazonS3Uploader.uploadToS3(BUCKET_PRODUCTS_IMAGES, productThumbnailFilename, thumbnailInputStream); 

... and added this line inside my generateThumbnail method:

productInputStream.reset(); 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!