将图像保存为字节并上传到 boto3 返回内容-MD5 不匹配

新手上路,请多包涵

我正在尝试从 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.

如果我只是拉出一个图像,然后在不对其进行操作的情况下将其放回原位,则效果很好。我不太确定这里发生了什么。

原文由 user3610691 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 662
2 个回答

我遇到了同样的问题,解决方案是寻找保存的内存文件的开头:

 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)

原文由 Nathaniel Ford 发布,翻译遵循 CC BY-SA 3.0 许可协议

在将文件发送到 S3 之前,可能需要保存并重新加载该文件。文件指针查找也需要为 0。

我的问题是在读出文件的前几个字节后发送文件。干净地打开文件就可以了。

原文由 Dmitri R117 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
Stack Overflow 翻译
子站问答
访问
宣传栏