我想使用flask上传大文件。并非尝试将整个文件加载到内存中,而是实现了request.stream.read()方法,以便按照以下代码将文件分块流式传输到磁盘,这与对许多类似问题的回答非常相似我发现:
@app.route("/uploadData", methods=["POST"])
def uploadData():
filename = uuid.uuid4().hex + '.nc'
filePath = os.path.join("/tmp", filename)
with open(filePath, "wb+") as f:
chunk_size = 4096
while True:
chunk = flask.request.stream.read(chunk_size)
if len(chunk) == 0:
break
f.write(chunk)
return flask.jsonify({'success': True, 'filename': filename})
除了将文件“包装”在帖子数据中外,这很有效,如下所示:
------WebKitFormBoundaryoQ8GPdNkcfUNrKBd
Content-Disposition: form-data; name="inputFile"; filename="some_file_upload.nc"
Content-Type: application/x-netcdf
<Actual File content here>
------WebKitFormBoundaryoQ8GPdNkcfUNrKBd--
如何在不获取表单边界内容的情况下将文件流式传输到磁盘?
从理论上讲,我可以调用flask.request.file
之类的文件来正确获取文件,但是那样会将整个文件加载到内存中(或者更可能是一个临时文件),并且相对于stream方法而言相当慢,我不喜欢它作为解决方案。
如果有所作为,我将使用以下javascript启动文件上传:
var formData=new FormData($('#fileform')[0])
$.ajax({
url:'/uploadData',
data:formData,
processData:false,
contentType:false,
type:'POST'
})
编辑:通过使用readline()而不是read(),我设法解决了这个问题,丢弃了前四行,然后检查以“ ---”开头的块以丢弃最后一行,作品。但是,这种感觉既笨拙又脆弱,因此,如果有更好的解决方案,我很想听听。