Python Flask-如何在将图像上传到Amazon s3之前读取图像的大小

时间:2017-09-21 19:38:06

标签: python python-3.x amazon-web-services amazon-s3 python-imaging-library

如果您对Python FlaskBoto3Pillow(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上传的问题,但我无法弄明白。你能吗?

提前致谢。

1 个答案:

答案 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。我不能夸大BytesIOStringIO对于做这类事情的有用程度!