【问题标题】:Flask Upload with no Content-Type or Form Data at AllFlask Upload 完全没有 Content-Type 或表单数据
【发布时间】:2020-10-14 23:17:33
【问题描述】:

我正在尝试通过将所有 POST 请求代理到脚本来使用 Apache2.4 上的 WSGI 使用 Python3 Flask 绕过 this WebDAV POST issue

我已经能够成功上传 PUT 以使用 CURL 创建一个文件,如下所示:

但是当我触发预期的服务上传时,PUT 缺少Content-Type 和表单数据:

这会导致所有包含request.files 条件的 Flask 上传示例失败:

@app.route('/<path:fullpath>', methods = ['POST', 'PUT'])
def upload_files(fullpath):
    if not request.files:
        abort(400, "File not found")

尽管我进行了搜索,但我不知道如何进行这种上传(原始?)类型。
我相信我需要使用流,但即使是这些示例也适用于 request.files()

有人知道我是如何上传这些文件的吗?

【问题讨论】:

    标签: python-3.x flask stream


    【解决方案1】:

    解决方案是使用文件流。经过多天的搜索,我终于found this blog post 提到了使用 Flask/Requests file 调用的具体问题:

    诀窍似乎是您不应该使用其他请求属性,例如 request.form 或 request.file,因为这会将流具体化到内存/文件中。如果文件超过 500Kb,Flask 默认会将文件保存到磁盘,所以不要触摸文件。

    运行附加的方法立即解决了没有multipart-form的上传问题:

    from flask import Flask
    import requests
    from flask import request
    
    app = Flask(__name__)
    
    
    # Upload file as stream to a file.
    @app.route("/upload", methods=["POST"])
    def upload():
        with open("/tmp/output_file", "bw") as f:
            chunk_size = 4096
            while True:
                chunk = request.stream.read(chunk_size)
                if len(chunk) == 0:
                    return
                f.write(chunk)
        return 'created', 201
    

    (完全归功于@izmailoff,但我添加了最后一行,否则接收方会出现超时问题)

    【讨论】:

      猜你喜欢
      • 2022-01-24
      • 2014-08-22
      • 2012-01-21
      • 1970-01-01
      • 2016-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多