我很难用S3从Amazon下载JPG文件,我想将这段代码加载到Heroku,所以我需要将图像加载到内存中,而不是磁盘上。
我使用的代码是:
import boto3
s3 = boto3.client(
"s3",
aws_access_key_id = access_key,
aws_secret_access_key = access_secret
)
s3.upload_fileobj(image_conv, bucket, Key = "image_3.jpg")
new_obj = s3.get_object(Bucket=bucket, Key="image_3.jpg")
image_dl = new_obj['Body'].read()
Image.open(image_dl)
我收到了错误消息:
File ..... line 2968, in open
fp = builtins.open(filename, "rb")
ValueError: embedded null byte
调用image_dl将返回我假设为字节的大量长列表,其中一个小部分如下所示:
f\xbc\xdc\x8f\xfe\xb5q\xda}\xed\xcb\xdcD\xab\xe6o\x1c;\xb7\xa0\xf5\xf5\xae\xa6)\xbe\xee\xe6\xc3vn\xdfLVW:\x96\xa8\xa3}\xa4\xd8\xea\x8f*\x89\xd7\xcc\xe8\xf0\xca\xb9\x0b\xf4\x1f\xe7\x15\x93\x0f\x83ty$h\xa6\x83\xc8\x99z<K\xc3c\xd4w\xae\xa4\xc2\xfb\xcb\xee\xe0
上传到S3之前的图像返回了下面的内容,这就是我试图将图像返回到的格式。有人能帮我知道我哪里出问题了吗?
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1440x1440 at 0x7F2BB4005EB0>
发布于 2021-08-19 20:38:10
枕头的图像类要么需要一个文件名来打开,要么需要一个类似文件的对象来调用read
。因为您没有文件名,所以需要提供一个流。最简单的方法是使用BytesIO
将字节数组转换为strem:
import boto3
from PIL import Image
from io import BytesIO
bucket = "--example-bucket--"
s3 = boto3.client("s3")
with open("image.jpg", "rb") as image_conv:
s3.upload_fileobj(image_conv, bucket, Key="image_3.jpg")
new_obj = s3.get_object(Bucket=bucket, Key="image_3.jpg")
image_dl = new_obj['Body'].read()
image = Image.open(BytesIO(image_dl))
print(image.width, image.height)
发布于 2021-08-19 11:57:36
首先尝试将原始数据加载到BytesIO容器中:
from io import StringIO
from PIL import Image
file_stream = StringIO()
s3.download_fileobj(bucket, "image_3.jpg", file_stream)
img = Image.open(file_stream)
https://stackoverflow.com/questions/68847323
复制相似问题