Flask: загрузка потокового файла без данных границы формы в файл - PullRequest
0 голосов
/ 06 февраля 2019

Я хочу загружать большие файлы, используя колбу.Вместо того, чтобы пытаться загрузить весь файл в память, я реализовал метод 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 или что-то подобное, чтобы получить файл правильно, но так как это загружает весь файл в память (или, скорее, временный файл), идовольно медленный по сравнению с потоковым методом, мне не нравится его решение.

Если это имеет значение, я инициирую загрузку файла, используя следующий javascript:

var formData=new FormData($('#fileform')[0])

$.ajax({
    url:'/uploadData',
    data:formData,
    processData:false,
    contentType:false,
    type:'POST'
    })

РЕДАКТИРОВАТЬ: мне удалось обойти эту проблему, используя readline () вместо read (), отбрасывая первые четыре строки, а затем проверяя блок, начинающийся с "---", чтобы отбросить последнюю строку, в то время какч работает.Тем не менее, это кажется и грязным, и хрупким, поэтому, если есть лучшее решение, я хотел бы услышать его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...