烧瓶:将文件上传而无需将表单边界数据上传到文件

时间:2019-02-05 23:50:55

标签: flask file-upload

我想使用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(),我设法解决了这个问题,丢弃了前四行,然后检查以“ ---”开头的块以丢弃最后一行,作品。但是,这种感觉既笨拙又脆弱,因此,如果有更好的解决方案,我很想听听。

0 个答案:

没有答案