python - 让客户端通过 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
属性。
解决方案
一种好的做法是使用预签名的 URL。这是高级的过程:
- 您的客户请求上传文件的权限
- 您的 Lambda 函数被触发,生成预签名 URL(确保 Lambda 对 S3 存储桶具有必要的权限)并响应客户端
- 客户端获取预签名的 URL 并将文件直接上传到 S3;
优点是:
通过不上传两次(一次到 Lambda,第二次到 S3)来减少网络延迟;
减少您的 Lambda 账单:生成预签名 URL 比等待上传要快得多,因此更便宜;
消除上传失败:Lambda 超时为 5 分钟,如果上传需要更多时间,则会失败(如果文件太大或您的用户网络连接不佳,可能会发生这种情况);
推荐阅读
- arrays - 如何根据第二个数组的部分或全部内容过滤数组
- python - Numpy:对多个数组进行花式索引
- java - 使用多个片段的最佳方式是什么?
- css - class="modal-dialog" style="padding-top: 20px; !important" - 没用
- javascript - 数据表行组显示条件?
- vue.js - 如何从 Vuex 的另一家商店调用 getter?
- java - CLASSPATH 问题
- php - 通过 ajax 将变量传递给外部 php 文件,然后将其插入 mysql 数据库
- node.js - 节点中的子进程缺少信息
- javascript - 使用 redux 反应导航