python - 让客户端通过 Chalice 将图像上传到 S3 存储桶的最佳实践是什么?

标签 python rest amazon-s3 chalice

我正在使用Chalice framework创建 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'})

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

最佳答案

一个好的做法是使用 pre-signed URL 。以下是高级流程:

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

优点是:

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

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

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

关于python - 让客户端通过 Chalice 将图像上传到 S3 存储桶的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807102/

相关文章:

ruby - 如何拯救 Aws::AwsError: NoSuchKey

amazon-web-services - AWS S3 - 如何阻止图像强制下载而不是显示。

python - 在python中逐行读取txt文件作为 float 列表

Android : Volley 1. 0.18 如何禁用请求缓存?

java - 如何使用 jersey 将 header 信息作为键值对传递以使用休息服务

rest - 在 URL 中使用动词是否与 REST 根本不兼容?

amazon-web-services - AWS 云信息 |如何配置 Lambda 以使用 S3 存储桶中的最新代码

python - 无法运行 Django 单元测试。返回 django.core.exceptions.ImproperlyConfigured

python - 列表理解中的 KeyError 异常

二进制数的Python遗传算法