我有一个网页(网络应用程序),允许用户将文件上传到服务器。服务器端是 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”引起的,但我不知道为什么或如何解决这个问题。