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