2016-03-23 16 views
7

Tôi nhận được ngoại lệ, tôi chưa bao giờ có trước khi thử nghiệm ứng dụng tải lên tệp từ ec2 đến s3. Nội dung là:Một ngoại lệ "Nội dung-MD5 bạn chỉ định không khớp với những gì chúng tôi nhận được"

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) 

Tôi có thể làm gì để khắc phục lỗi này? Tôi đã sử dụng mã giống như trước đây trong ứng dụng của mình.

Trả lời

10

Tôi nghĩ rằng tôi đã giải quyết được vấn đề của mình. Cuối cùng tôi thấy rằng một số tệp của tôi thực sự đã thay đổi trong khi tải lên. Bởi vì tập tin được tạo ra bởi một chủ đề khác, việc tải lên và tạo ra được thực hiện cùng một lúc. Không thể tạo tệp ngay lập tức và trong quá trình tạo tệp, tệp có thể đang tải lên cùng một lúc, tệp thực sự đã thay đổi trong khi tải lên.

Md5 của tệp được tạo khi bắt đầu tải lên bởi AmazonS3Client, sau đó toàn bộ tệp được tải lên S3, tại thời điểm này, tệp khác với tệp được tải lên lúc đầu, vì vậy md5 thực sự đã thay đổi. Tôi đã sửa đổi chương trình của mình thành một chương trình đơn luồng và vấn đề không bao giờ được bật lên nữa.

+0

yeah, có lẽ là 2 chủ đề mở: 'với open ('foo.txt') như f: với open ('bar.txt') là b: do_something()' –

1

Tôi cũng chạy vào lỗi này khi tôi đang làm một cái gì đó như thế này:

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); 

Các generateThumbnail phương pháp được thao tác productInputStream sử dụng một thư viện của bên thứ ba. Bởi vì tôi không thể thay đổi thư viện của bên thứ ba, tôi chỉ đơn giản là thực hiện việc tải lên đầu tiên:

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); 

... và thêm dòng này bên generateThumbnail tôi phương pháp:

productInputStream.reset(); 
3

Một lý do khác để có vấn đề này là chạy mã như thế này (python)

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

Trong trường hợp này đối tượng tệp (fd) đang trỏ đến cuối tệp khi nó đạt dòng 3, vì vậy chúng tôi sẽ nhận được "Nội dung MD5" lỗi, để tránh nó, chúng ta sẽ cần phải chỉ người đọc tập tin trở lại vị trí bắt đầu trong file

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

Bằng cách này chúng tôi sẽ không có được lỗi Boto nói trên.

+0

Nếu bạn sử dụng cú pháp 'with' và thao tác các tệp, có khả năng đây là vấn đề của bạn. Đó chắc chắn là của tôi. – Preston

Các vấn đề liên quan