使用 Boto3 将缩略图上传到 S3
Upload Thumbnail Image to S3 using Boto3
我正在使用 Falcon 框架和 Pillow 将联系人的个人资料图片上传到 S3,然后调整该图片的大小以获得缩略图,然后上传该缩略图。
我查看了其他答案,但有些答案需要 ,有些使用我没有的 django 的 default_storage
功能。
client = boto3.client('s3',
aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY')
)
class UploadResource(object):
def on_post(self, req, res):
#gathering file from SPA
contact_id = req.get_param('id')
filename = req.get_param('file').filename
file = req.get_param('file').file
salt = ''.join(chr(random.randint(97, 122)) for i in range(20))
filename = salt + '-' + filename
filename_thumb = salt + '-thumb-' + filename
#uploading normal sized image
client.upload_fileobj(file, 'contacts-cloud-images', filename)
#pull down image again and resize
img = Image.open(requests.get(image_url, stream=True).raw)
img.thumbnail((50,50))
print(img.format, img.size)
#save it to BytesIO container
io = BytesIO()
img.save(io, img.format)
#upload value of BytesIO container
---> client.upload_fileobj(io.getvalue(), 'contacts-cloud-images', filename_thumb)
我从带有箭头 (---->
) 的行得到以下错误:
ValueError: Fileobj must implement read
该错误意味着 client.upload_fileobj
需要一个实现 read
方法的类文件对象,但您传递给它的是类文件对象的内容 (io.getvalue()
) 而不是类文件对象本身 (io
)
文档的 link
重要的无关说明:需要注意的重要事项是您正在命名保存缓冲区的变量io
。 io
也是标准库模块的名称,你正在覆盖它。那应该是绝对不行的。尽管变量的局部范围,我建议您将其重命名为有意义的名称,例如 file_content
或 image_content
.
我正在使用 Falcon 框架和 Pillow 将联系人的个人资料图片上传到 S3,然后调整该图片的大小以获得缩略图,然后上传该缩略图。
我查看了其他答案,但有些答案需要 default_storage
功能。
client = boto3.client('s3',
aws_access_key_id=os.environ.get('AWS_ACCESS_KEY_ID'),
aws_secret_access_key=os.environ.get('AWS_SECRET_ACCESS_KEY')
)
class UploadResource(object):
def on_post(self, req, res):
#gathering file from SPA
contact_id = req.get_param('id')
filename = req.get_param('file').filename
file = req.get_param('file').file
salt = ''.join(chr(random.randint(97, 122)) for i in range(20))
filename = salt + '-' + filename
filename_thumb = salt + '-thumb-' + filename
#uploading normal sized image
client.upload_fileobj(file, 'contacts-cloud-images', filename)
#pull down image again and resize
img = Image.open(requests.get(image_url, stream=True).raw)
img.thumbnail((50,50))
print(img.format, img.size)
#save it to BytesIO container
io = BytesIO()
img.save(io, img.format)
#upload value of BytesIO container
---> client.upload_fileobj(io.getvalue(), 'contacts-cloud-images', filename_thumb)
我从带有箭头 (---->
) 的行得到以下错误:
ValueError: Fileobj must implement read
该错误意味着 client.upload_fileobj
需要一个实现 read
方法的类文件对象,但您传递给它的是类文件对象的内容 (io.getvalue()
) 而不是类文件对象本身 (io
)
重要的无关说明:需要注意的重要事项是您正在命名保存缓冲区的变量io
。 io
也是标准库模块的名称,你正在覆盖它。那应该是绝对不行的。尽管变量的局部范围,我建议您将其重命名为有意义的名称,例如 file_content
或 image_content
.