Загрузка нескольких файлов с помощью 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", но я понятия не имею, почему или как решить проблему.

0 ответов

Другие вопросы по тегам