我正在使用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 。以下是高级流程:
- 您的客户端请求上传文件的权限
- 您的 Lambda 函数将被触发,生成预签名 URL(确保 Lambda 对 S3 存储桶具有必要的权限)并响应客户端
- 客户端获取预签名 URL 并将文件直接上传到 S3;
优点是:
通过不上传两次(一次上传到 Lambda,第二次上传到 S3)来减少网络延迟;
减少您的 Lambda 费用:生成预签名 URL 比等待上传要快得多,因此更便宜;
消除上传失败:Lambda 超时为 5 分钟,如果上传时间较长,则会失败(如果文件太大或您的用户的互联网连接状况不佳,则可能会发生这种情况);
里>
关于python - 让客户端通过 Chalice 将图像上传到 S3 存储桶的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50807102/