私はs3から画像をプルし、それを量子化/操作してから、何もディスクに保存せずに(完全にメモリ内に)s3に保存しようとしています。私はそれを一度行うことができましたが、コードに戻ってそれを再試行すると、うまくいきませんでした。コードは次のとおりです。
import boto3
import io
from PIL import Image
client = boto3.client('s3',aws_access_key_id='',
aws_secret_access_key='')
cur_image = client.get_object(Bucket='mybucket',Key='2016-03-19 19.15.40.jpg')['Body'].read()
loaded_image = Image.open(io.BytesIO(cur_image))
quantized_image = loaded_image.quantize(colors=50)
saved_quantized_image = io.BytesIO()
quantized_image.save(saved_quantized_image,'PNG')
client.put_object(ACL='public-read',Body=saved_quantized_image,Key='testimage.png',Bucket='mybucket')
私が受け取ったエラーは:
botocore.exceptions.ClientError: An error occurred (BadDigest) when calling the PutObject operation: The Content-MD5 you specified did not match what we received.
画像をプルして、操作せずに元に戻しても問題ありません。ここで何が起こっているのかよくわかりません。
これと同じ問題があり、解決策は保存されたメモリ内ファイルの先頭にシークすることでした。
out_img = BytesIO()
image.save(out_img, img_type)
out_img.seek(0) # Without this line it fails
self.bucket.put_object(Bucket=self.bucket_name,
Key=key,
Body=out_img)
S3に送信する前に、ファイルを保存して再ロードする必要がある場合があります。ファイルポインターのシークも0にする必要があります。
私の問題は、ファイルの最初の数バイトを読み取った後にファイルを送信することでした。ファイルをきれいに開くとうまくいきました。
ファイルをアップロードしようとして同じエラーが発生するこの質問が見つかりました-2つのスクリプトが衝突し、1つは作成、もう1つはアップロードです。私の答えは、「。filename」を使用して作成することでした:
os.rename(filename.replace(".filename","filename"))
その後、アップロードスクリプトは無視する必要があります。ファイル。これにより、ファイルが確実に作成されます。