在 AWS 上存储用户图像

Storing user images on AWS

我正在使用 ionic2 实现一个简单的应用程序,它调用使用 Flask 构建的 API。设置个人资料时,我会为用户提供上传自己图片的选项。 我想将它们存储在 S3 存储桶中并通过 CloudFront 为它们提供服务。

经过一番研究,我只能找到以下信息:

当你有一个前端与 API 交互时,我找不到任何关于如何处理 blobs/files 的信息。当我开始研究时,我想到的选项是:

  1. Post 将文件发送到客户端的 Amazon 并 return CloudFront url 直接到后端。我不太热衷于此 一个是因为它涉及在 客户端(也许不是那么危险,但我宁愿拥有它 在后端)。
  2. 将图像上传到服务器并以某种方式告诉后端 我们希望后端选择哪个文件。我不太热衷 这种方法要么是因为客户需要有知识 关于服务器本身(不仅是 API)。
  3. 图片编码(我有base64,但是没有 示例我认为这是完全错误的)并且 post 它到后端, 它将处理所有 S3 upload/store CloudFront URL.

我觉得所有这些方法都是完全错误的,但我想不出(或找不到)什么是正确的做法。

我该如何处理?

让服务器生成 pre-signed URL 供客户端上传图像。这意味着服务器控制着 URL 的外观并且它不会暴露任何秘密,但客户端可以将图像直接上传到 S3。

Generating a pre-signed URL in Python using boto3 看起来像这样:

s3 = boto3.client('s3', aws_access_key_id=..., aws_secret_access_key=...)
params = dict(Bucket='my-bucket', Key='myfile.jpg', ContentType='image/jpeg')
url = s3.generate_presigned_url('put_object', Params=params, ExpiresIn=600)

ContentType 是可选的,客户端在上传到 url 时必须设置相同的 Content-Type HTTP header;如果已知,我发现限制允许的文件类型很方便。