我正在使用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'})
这不起作用。我已经回顾了在烧瓶中执行此操作的方法,但由于烧瓶具有request.files
属性,因此语法略有不同。
答案 0 :(得分:2)
一种好的做法是使用pre-signed URL。这是高层的过程:
优点是:
通过两次上传(一次到Lambda,第二次到S3)来减少 not 的网络延迟;
减少您的Lambda帐单:生成预签名的URL比等待上传要快得多,因此更便宜;
消除上载失败:Lambda超时为5分钟,如果上载花费更多时间(如果文件太大或您的用户的互联网连接不正常,可能会发生),它将失败;
< / li>答案 1 :(得分:1)
一种好的做法是使用API Gateway作为S3存储桶的代理。使用API网关的主要优点是它可以处理暴露S3存储桶的许多安全方面。例如,它将负责用户身份验证以及节制滥用或过多请求。 AWS tutorial详细说明了如何实现。