我正在使用 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

最佳答案

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

这是 upload_fileobj 文档的链接

重要的非相关说明 :需要注意的重要一点是您命名了保存缓冲区 io 的变量。 io 也是标准库模块的名称,您正在覆盖它。那应该是绝对的禁忌。尽管您的变量具有局部范围,但我建议您将其重命名为有意义的名称,例如 file_contentimage_content

关于python - 使用 Boto3 将缩略图图像上传到 S3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45268003/

10-16 22:26