【问题标题】:Upload Thumbnail Image to S3 using Boto3使用 Boto3 将缩略图上传到 S3
【发布时间】:2017-07-24 01:51:17
【问题描述】:

我正在使用 Falcon 框架和 Pillow 将联系人的个人资料图片上传到 S3,然后调整该图片的大小以获得缩略图,然后上传该缩略图。

我查看了其他答案,但其中一些需要 bucket write access activated,而有些需要使用 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

【问题讨论】:

    标签: python amazon-s3 boto3 pillow falconframework


    【解决方案1】:

    错误意味着client.upload_fileobj 期待一个实现read 方法的类文件对象,但您传递给它的是类文件对象 (io.getvalue()) 的内容,而不是类文件对象本身 (io)

    这是upload_fileobj文档的链接

    重要的非相关说明:需要注意的重要一点是,您将保存缓冲区的变量命名为 ioio 也是标准库模块的名称,而您正在覆盖它。那应该是绝对禁止的。尽管你的变量在本地范围内,我还是建议你把它重命名为有意义的名字,比如file_contentimage_content

    【讨论】:

    • 现在在 S3 上说上传的文件是0B。我不确定是什么原因导致文件在上述代码中不包含任何数据。我确实最终上传了io 对象,而不是使用getvalue() 方法。 (我也确实重命名了,谢谢。)
    • 我会验证print(img.format, img.size) 行正在打印大小的非零值。澄清一下,boto3 不会上传类文件对象,它会上传文件的内容,但它的构建方式是您需要将类文件对象传递给它跨度>
    • 我还要指出,我没有在任何地方看到 image_url 定义。但是,认为这是问题的原因还很牵强,因为如果 image_url 不包含有效的 url,requests.get 会引发错误,如果请求的主体不包含, Image.open 会引发错误一张有效的图片。
    • 谢谢,原来我必须在类文件对象上调用.seek(0) 才能将其倒回到开头。
    猜你喜欢
    • 2018-11-19
    • 2018-09-12
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-27
    • 2015-01-05
    相关资源
    最近更新 更多