使用 Boto3 将缩略图上传到 S3

qar*_*dso 5 python amazon-s3 python-imaging-library falconframework 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)
Run Code Online (Sandbox Code Playgroud)

我从带有箭头 ( ) 的行收到以下错误---->:

ValueError: Fileobj must implement read

Lui*_*rez 5

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

这是upload_fileobj文档的链接

重要的非相关注意事项:需要注意的重要事项是您正在命名保存缓冲区的变量io。io也是标准库的模块的名称,并且您正在覆盖它。这应该是绝对禁忌。尽管变量的本地范围有限,但我建议您将其重命名为有意义的名称,例如file_content或image_content。

  • 谢谢,事实证明我必须在类似文件的对象上调用 `.seek(0)` 才能将其_倒回_到开头。 (8认同)
  • 现在在 S3 上显示上传的文件是“0B”。我不确定发生了什么导致文件在上述代码中不包含数据。我最终上传了“io”对象,而不是使用“getvalue()”方法。(我也重命名了它,谢谢你。) (2认同)