通过 flask API 将上传的文件流式传输到 MinIO 存储
Stream uploaded file via flask API to MinIO storage
在我们的烧瓶 API 中,我们有一个用于上传文档的端点。此端点接收上传的文档,进行一些检查并将此文档上传到 MinIO。
我们希望将接收到的文档直接流式传输到远程存储,而无需通过 API.
对其进行实际处理
一个想法是执行以下操作:
@app.route('/upload', methods=['POST'])
def upload():
upload_url = get_presigned_upload_url()
response = requests.put(url=upload_url, files={'file': request.stream})
在上面的代码中我可以看到两个问题:
1- 如何确保流只包含一个文件
2- 如何从实际文件中提取 mimetype,而不仅仅是信任文件扩展名
按照 here 中关于上传大文件的建议,我能够获得我需要的所有信息,包括 mime 类型和上传的文件数量。
我用过的代码:
@app.route('/upload', methods=['POST'])
def upload():
upload_url = get_presigned_upload_url()
def custom_stream_factory(total_content_length, filename, content_type, content_length=None):
import tempfile
tmpfile = tempfile.NamedTemporaryFile('wb+', prefix='flaskapp', suffix='.nc')
return tmpfile
import werkzeug, flask
stream, form, files = werkzeug.formparser.parse_form_data(flask.request.environ,
stream_factory=custom_stream_factory)
files_list = []
for fil in files.values():
files_list.append(
('file', (fil.filename, fil, fil.mimetype))
)
break
response = requests.put(url=upload_url, files=files_list)
在我们的烧瓶 API 中,我们有一个用于上传文档的端点。此端点接收上传的文档,进行一些检查并将此文档上传到 MinIO。 我们希望将接收到的文档直接流式传输到远程存储,而无需通过 API.
对其进行实际处理一个想法是执行以下操作:
@app.route('/upload', methods=['POST'])
def upload():
upload_url = get_presigned_upload_url()
response = requests.put(url=upload_url, files={'file': request.stream})
在上面的代码中我可以看到两个问题:
1- 如何确保流只包含一个文件
2- 如何从实际文件中提取 mimetype,而不仅仅是信任文件扩展名
按照 here 中关于上传大文件的建议,我能够获得我需要的所有信息,包括 mime 类型和上传的文件数量。
我用过的代码:
@app.route('/upload', methods=['POST'])
def upload():
upload_url = get_presigned_upload_url()
def custom_stream_factory(total_content_length, filename, content_type, content_length=None):
import tempfile
tmpfile = tempfile.NamedTemporaryFile('wb+', prefix='flaskapp', suffix='.nc')
return tmpfile
import werkzeug, flask
stream, form, files = werkzeug.formparser.parse_form_data(flask.request.environ,
stream_factory=custom_stream_factory)
files_list = []
for fil in files.values():
files_list.append(
('file', (fil.filename, fil, fil.mimetype))
)
break
response = requests.put(url=upload_url, files=files_list)