【问题标题】:Stream uploaded file via flask API to MinIO storage通过烧瓶 API 将上传的文件流式传输到 MinIO 存储
【发布时间】:2020-05-29 10:27:45
【问题描述】:

在我们的烧瓶 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,而不只是信任文件扩展名

【问题讨论】:

  • 如果我的理解错了,请纠正我,但是当前 /upload url 接收文件,在 do_something() 中对文件进行一些处理,然后生成要上传到 MinIo 的 url .您只想上传文件,它将直接流式传输到 min_io 而不被 do_something() 处理?
  • 不,它不会触及文件本身。可以说它进行了一些安全检查。你评论的第二部分正是我想要实现的目标
  • 我删除了 do_something() 部分,因为我可能会感到困惑。
  • 您似乎走在了正确的道路上。关于您的观点 (1) 和 (2) ,对于 (1) 您可以限制您的烧瓶 api 路由不接受请求标头中的“multipart/form-data”。对于(2)看看下面的答案stackoverflow.com/questions/481743/…
  • hmm 但我希望此上传端点接收文件。禁用 multipart/form-data 后如何接收此文件?

标签: python flask streaming minio


【解决方案1】:

按照here 中关于上传大文件的建议,我能够获得所需的所有信息,包括 mimetype 和上传的文件数。

我用过的代码:

@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)

【讨论】:

  • @AkibRhast 请看看这是否有帮助:)
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2013-08-21
相关资源
最近更新 更多