Загрузка нескольких файлов с помощью Quart/Flask добавляет файловые объекты к форме в виде байтов и ничего к файлам
У меня есть веб-страница (веб-приложение), которая позволяет пользователям загружать файлы на сервер. На стороне сервера находится Python Quart (асинхронная колба) с сервером HyperCorn за Nginx.
Проблема, я не могу загрузить несколько файлов. Один файл загружается без каких-либо проблем, и все работает, как ожидалось.
Я прочитал все посты переполнения стека, связанные с этим, и я пробовал бесчисленное множество предлагаемых решений. Эта ситуация отличается, когда форма отправляется с одним файлом, объект файла включается в часть запроса "файлы", но когда отправляется несколько файлов, часть запроса "файлы" пуста, а файл - объекты включаются в "форму" с правильным ключом, а его значение является "байтовым" объектом.
HTML-форма:
<form method="POST"
action="/upload"
enctype="multipart/form-data">
<div>
<input value="xyz" name="number" type="hidden">
<textarea name="message" placeholder="write message"></textarea>
</div>
<div>
<input name="attach" multiple="" type="file">
<input value="send" type="submit">
</div>
</form>
Форма добавляется на страницу на стороне клиента с помощью JS, а форма отправляется асинхронно с использованием запроса Fetch. Заголовок запроса:
Accept: */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US;q=0.7,en;q=0.3
Connection: keep-alive
Content-Length: 14563
Content-type: multipart/form-data; boundary=…-5168
Cookie:
DNT: 1
Host: www.example.com
origin: https://www.example.com
Referer: https://www.example.com/mypage.html
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linu…) Gecko/20100101 Firefox/62.0
Полезная нагрузка запроса:
-----------------------------5168578291153853291511672298
Content-Disposition: form-data; name="number"
ABC123
-----------------------------5168578291153853291511672298
Content-Disposition: form-data; name="message"
Some message
-----------------------------5168578291153853291511672298
Content-Disposition: form-data; name="attach"; filename="image-256.png"
Content-Type: image/png
На сервере:
@app.route('/upload', methods=['POST'])
async def upload_post():
form = await request.form
form_data = {key: form.get(key) for key in form}
print('form_data is:', form_data)
uploads = await request.files
if 'attach' in uploads:
all_uploads = uploads.getall('attach')
print('uploads is:', all_uploads)
else:
print('No attach in uploads is:')
Когда передается один файл, ключ "attach" обнаруживается в загрузках, а "print" показывает правильный мультидиктовый объект. Ключ 'attach' отсутствует в form_data. Когда передано два или более файлов, загрузка имеет длину 0, и ключ 'attach' затем находится в form_data с байтовым объектом в качестве значения.
Я уверен, что проблема вызвана "await request.files", но я понятия не имею, почему или как решить проблему.