0

我有一个网页(网络应用程序),允许用户将文件上传到服务器。服务器端是 Python Quart(async Flask),在 Nginx 后面有 hypercorn 服务器。

问题,我无法上传多个文件。单个文件上传没有任何问题,一切都按预期工作。

我已经阅读了与此相关的所有堆栈溢出帖子,并且尝试了无数建议的解决方案。这种情况不同,当表单用单个文件提交时,文件对象包含在请求的“文件”部分中,但当提交多个文件时,请求的“文件”部分为空,文件-对象包含在具有正确键的“表单”中,其值是“字节”对象。

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' 键不在 form_data 中。当提交两个或更多文件时,上传的长度为 0,然后在 form_data 中找到“attach”键,并将字节对象作为值。

我确定这个问题是由“await request.files”引起的,但我不知道为什么或如何解决这个问题。

4

0 回答 0