我正在尝试创建一个简单的Flask端点,用于通过POST
或PUT
上传文件。我希望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.stream
(wsgi.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
谢谢!