在AWS上存储用户图像

时间:2017-06-22 09:05:03

标签: python angular amazon-web-services ionic2 flask-restful

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

经过一些研究,我只能找到有关的信息:

  • 使用python从本地存储上传图像。
  • 使用javascript从HTML文件选择器上传图片。

当前端与API交互时,我无法找到有关如何处理blob /文件的任何信息。当我开始研究我想到的选项时:

  1. 在客户端将文件发布到亚马逊并返回 CloudFront url直接到后端。我对此并不太热衷 一个因为它会涉及到某种秘密 客户端(可能不是那么危险,但我宁愿拥有它 在后端)。
  2. 将图像上传到服务器并以某种方式告诉后端 我们希望后端选择哪个文件。我不太热衷于此 这种方法要么是因为客户需要知识 关于服务器本身(不仅仅是API)。
  3. 对图像进行编码(我已尝试过base64,但缺少 例子我认为这是完全错误的)并将其发布到后端, 它将处理所有S3上传/存储CloudFront URL。
  4. 我觉得所有这些方法都是完全错误的,但我无法思考(或找到)正确的做法。

    我应该如何处理它?<​​/ p>

1 个答案:

答案 0 :(得分:2)

让服务器为客户端生成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是可选的,客户端必须在上传到Content-Type期间设置相同的url HTTP标头;如果已知,我发现限制允许的文件类型很方便。