2016-03-23 4 views
7

Ich habe eine Ausnahme bekommen, die ich nie zuvor beim Testen meiner Anwendung bekommen habe, die eine Datei von ec2 nach s3 hochlädt. Der Inhalt ist:Eine Ausnahme "Der Content-MD5, den Sie angegeben haben, stimmte nicht mit dem überein, was wir erhalten haben"

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) 

Was kann ich tun, um diesen Fehler zu beheben? Ich habe den gleichen Code wie zuvor in meiner Anwendung verwendet.

Antwort

10

Ich denke, ich habe mein Problem gelöst. Ich habe schließlich festgestellt, dass sich einige meiner Dateien während des Hochladens tatsächlich geändert haben. Da die Datei von einem anderen Thread erstellt wird, erfolgt das Hochladen und Generieren gleichzeitig. Die Datei kann nicht sofort generiert werden, und während der Erstellung einer Datei kann sie gleichzeitig hochgeladen werden, die Datei wird während des Uploads tatsächlich geändert.

Die md5 der Datei wird zu Beginn des Hochladens durch den AmazonS3Client erstellt, dann wird die ganze Datei in die S3 hochgeladen, zu dieser Zeit unterscheidet sich die Datei von der zu Beginn hochgeladenen Datei, so dass sich die md5 tatsächlich geändert hat. Ich habe mein Programm in ein Single-Threading-Programm geändert, und das Problem ist nie wieder aufgetaucht.

+0

ja, gibt es wahrscheinlich zwei Threads öffnen: 'mit open ('foo.txt') als f: mit open ('bar.txt') als b: do_something()' –

1

Ich lief auch in diesen Fehler, wenn ich so etwas wie dies tat:

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

Die gene Methode, um die productInputStream eine Dritte Bibliothek Manipulation wurde. Weil ich nicht die Dritte Bibliothek ändern konnte, führte ich einfach den Upload zuerst:

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

... und fügte hinzu, diese Zeile in meinem gen Methode:

productInputStream.reset(); 
3

Ein weiterer Grund dafür, dass dieses Problem ist ein Code wie dieser (python)

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

In diesem Fall das Dateiobjekt (fd) zeigt auf das Ende der Datei, wenn es laufen erreicht Linie 3, werden wir den „Content MD5“ Fehler, um es zu vermeiden wir die Datei Leser Punkt zurück in die Startposition in der Datei

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

Auf diese Weise erhalten wir nicht benötigen, so erhalten der oben erwähnte Boto-Fehler.

+0

Wenn Sie Mit der 'mit'-Syntax und der Manipulation von Dateien ist es wahrscheinlich das Problem. Es war definitiv meins. – Preston