2016-03-23 17 views
7

私は例外があります。私のアプリケーションをテストして、ec2からs3にファイルをアップロードすることはありませんでした。内容は次のとおりです:「指定したContent-MD5が受信したものと一致しませんでした」

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) 

このバグを修正するにはどうすればよいですか?私は以前のアプリケーションと同じコードを使用しました。

答えて

10

私は私の問題を解決したと思います。私は最終的に私のファイルのいくつかがアップロード中に実際に変更されていることを発見しました。ファイルは別のスレッドによって生成されるため、アップロードと生成は同時に行われます。このファイルはすぐには生成できません。また、ファイルの生成中に同時にアップロードされている可能性があります。ファイルは実際にアップロード中に変更されます。

AmazonS3Clientによるアップロードの開始時にファイルのmd5が作成され、その後、ファイル全体がS3にアップロードされます。このとき、ファイルは最初にアップロードされたファイルとは異なるため、実際に変更されました。私は自分のプログラムをシングルスレッドプログラムに変更しましたが、問題は決して再び発生しませんでした。 generateThumbnail方法は、サードパーティのライブラリを使用してproductInputStreamを操作した

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

+0

ええ、2つのスレッドが開いて、おそらくそこにある:bとオープン( 'bar.txt')との : を 'Fとして( 'foo.txtの')、オープンで do_something()' –

1

はまた、私はこのような何かをやっていたときに、このエラーに遭遇しました。

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

を...そして私のgenerateThumbnailメソッド内の行を追加::私はサードパーティのライブラリを変更することができませんでしたので、私は単純に最初のアップロードを行ったため

productInputStream.reset(); 
3

もう一つの理由この問題は、この場合にはファイルオブジェクト(FD)は、ファイルの終わりを指しているこのようなコード(パイソン)

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

を実行することです3行目に到達したので、我々は、我々は、ファイル

​​3210

我々が得ることはありません。この方法で、開始位置に戻ってファイルリーダーを指定する必要があります、それを避けるために、「コンテンツMD5」エラーになります前述のBotoエラー

+0

あなたがしている場合'with'構文を使用してファイルを操作すると、おそらくこれがあなたの問題です。それは間違いなく私のものでした。 – Preston

関連する問題