首页 > 解决方案 > 让客户端通过 Chalice 将图像上传到 S3 存储桶的最佳做法是什么?

问题描述

我正在使用Chalice 框架来创建 API 服务。我的用户需要上传图像,然后我需要将图像保存到 s3 存储桶。

用户应该如何将图像上传到我的端点,我的端点收到图像后应该做什么?

到目前为止,这是我的思考过程:

BUCKET = <bucket_name>    
@app.route('/n_number_search/', methods=['POST'])
    def n_number_search():
        body = app.current_request.raw_body
        s3_client.upload_file(body, BUCKET, UUID_file_name)
        return Response(body=f'upload successful: {}', status_code=200,
                        headers={'Content-Type': 'text/plain'})

这是行不通的。我已经回顾了在烧瓶中执行此操作的方法,但语法略有不同,因为烧瓶具有该request.files属性。

标签: pythonrestamazon-s3chalice

解决方案


一种好的做法是使用预签名的 URL。这是高级的过程:

  1. 您的客户请求上传文件的权限
  2. 您的 Lambda 函数被触发,生成预签名 URL(确保 Lambda 对 S3 存储桶具有必要的权限)并响应客户端
  3. 客户端获取预签名的 URL 并将文件直接上传到 S3;

优点是:

  • 通过不上传两次(一次到 Lambda,第二次到 S3)来减少网络延迟;

  • 减少您的 Lambda 账单:生成预签名 URL 比等待上传要快得多,因此更便宜;

  • 消除上传失败:Lambda 超时为 5 分钟,如果上传需要更多时间,则会失败(如果文件太大或您的用户网络连接不佳,可能会发生这种情况);


推荐阅读