如果您对Python Flask
,Boto3
,Pillow
(a.k.a。PIL
)有一些经验,这个问题可能相当简单。
我试图从客户端接收传入图像(仅允许.jpg
,.jpeg
,.tif
,并且我想阅读尺寸使用Boto3
将图像上传到Amazon S3之前的图像。
代码非常简单:
file = request.files['file']
# produces an instance of FileStorage
asset = models.Asset(file, AssetType.profile_img, donor.id)
# a model managed by the ORM
img = Image.open(BytesIO(file.stream.read()))
# produces a PIL Image object
size = img.size
# read the size of the Image object
asset.width = size[0]
asset.height = size[1]
# set the size to the ORM
response = s3.Object('my-bucket', asset.s3_key()).put(Body=file)
# upload to S3
这里有捕捉,我可以(A)读取图像或(B)上传到s3,但我不能同时做到这两点。从字面上看,评论出一个或另一个会产生所需的操作,但不能两者结合起来。
我已将其缩小到上传范围。我相信在某个地方,file.strea.read()操作会引起Boto3上传的问题,但我无法弄明白。你能吗?
提前致谢。
答案 0 :(得分:4)
你很接近 - 改变S3的字节源应该这样做。粗略地,这样的事情:
file = request.files['file']
# produces an instance of FileStorage
asset = models.Asset(file, AssetType.profile_img, donor.id)
# a model managed by the ORM
image_bytes = BytesIO(file.stream.read())
# save bytes in a buffer
img = Image.open(image_bytes)
# produces a PIL Image object
size = img.size
# read the size of the Image object
asset.width = size[0]
asset.height = size[1]
# set the size to the ORM
image_bytes.seek(0)
response = s3.Object('my-bucket', asset.s3_key()).put(Body=image_bytes)
# upload to S3
请注意对seek
的调用以及在调用S3时使用BytesIO。我不能夸大BytesIO
和StringIO
对于做这类事情的有用程度!