2016-03-23 6 views
7

Ho ottenuto un'eccezione, non l'ho mai avuto prima durante il test della mia applicazione che carica un file da ec2 a s3. Il contenuto è:Un'eccezione "Il Content-MD5 specificato non corrisponde a quello che abbiamo ricevuto"

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) 

Cosa posso fare per risolvere questo errore? Ho usato lo stesso codice di prima nella mia applicazione.

risposta

10

Penso di aver risolto il mio problema. Alla fine ho scoperto che alcuni dei miei file sono stati effettivamente modificati durante il caricamento. Poiché il file è generato da un altro thread, il caricamento e la generazione vengono eseguiti contemporaneamente. Il file non può essere generato immediatamente e, durante la generazione di un file, potrebbe essere caricato contemporaneamente, il file è stato effettivamente modificato durante il caricamento.

L'md5 del file viene creato all'inizio del caricamento da AmazonS3Client, quindi l'intero file viene caricato nell'S3, in questo momento, il file è diverso dal file caricato all'inizio, quindi l'md5 è effettivamente cambiato. Ho modificato il mio programma in un programma a thread singolo e il problema non si è più verificato.

+0

sì, v'è probabilmente 2 discussioni aperte: 'con aperta ('foo.txt') come f: con open ('bar.txt') come b: fa_qualcosa()' –

1

Ho anche imbattuto in questo errore quando stavo facendo qualcosa di simile:

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

Il metodo generateThumbnail stava manipolando il productInputStream utilizzando una libreria di terze parti. Perché io non sono riuscito a modificare la libreria di terze parti, ho semplicemente eseguito l'upload prima:

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

... e ho aggiunto questa linea all'interno del mio generateThumbnail metodo:

productInputStream.reset(); 
3

Un altro motivo per avere questo problema è quello di eseguire un codice come questo (pitone)

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

In questo caso l'oggetto file (fd) si indica la fine del file quando raggiunge la linea 3, così avremo l'errore "Contenuto MD5", al fine di evitare che avremo bisogno di puntare il lettore di file torna alla posizione di partenza nel file

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

In questo modo non avremo l'errore di Boto di cui sopra.

+0

Se sei usando la sintassi 'with' e manipolando i file, è probabile che questo sia il tuo problema. Era decisamente mio. – Preston

Problemi correlati