使用request.stream上传ReSTful Flask文件

时间:2016-03-13 21:08:10

标签: python rest file-upload flask wsgi

我正在尝试创建一个简单的Flask端点,用于通过POSTPUT上传文件。我希望URL中有filename,然后(在请求标头之后)只是在请求中流式传输原始文件数据。

我还需要能够上传略大于2GB的文件,我需要这样做而不将整个文件存储在内存中。起初,这似乎很简单:

@application.route("/upload/<filename>", methods=['POST', 'PUT'])
def upload(filename):
    # Authorization and sanity checks skipped.

    filename = secure_filename(filename)
    fileFullPath = os.path.join(application.config['UPLOAD_FOLDER'], filename)

    with open(fileFullPath, 'wb') as f:
        copyfileobj(request.stream, f)

    return jsonify({'filename': filename})

上传multipart/formdata后,我只需在文件上调用.save()即可。

但是,我上传的任何文件似乎都有不同的校验和(好吧,sha256sum,在服务器上然后在源上)。上传标准文本文件时,新行似乎被剥离。二进制文件似乎以其他奇怪的方式被破坏了。

我在上传时发送Content-Type: application/octet-stream以尝试让Flask将所有上传视为二进制。 request.streamwsgi.input的代理)是否以非二进制形式打开?我似乎无法从Flask代码中找出答案。如何将原始二进制格式的请求数据流式传输到磁盘上的文件?

我对黑客开放;这是一个测试项目(所以我也没有兴趣听到如何将这个作为formdata更好,或者这不是一个上传文件等的好方法。)

我通过以下方式测试:

curl -H 'Content-Type: application/octet-stream' -H 'Authorization: ...' -X PUT --data @/path/to/test/file.name https://test.example.com/upload/file.name

谢谢!

0 个答案:

没有答案