有没有办法用Flask接收多个上传的文件?我尝试过以下方法:
<form method="POST" enctype="multipart/form-data" action="/upload">
<input type="file" name="file[]" multiple="">
<input type="submit" value="add">
</form>
Run Code Online (Sandbox Code Playgroud)
然后打印出以下内容request.files['file']:
@app.route('/upload', methods=['POST'])
def upload():
if not _upload_dir:
raise ValueError('Uploads are disabled.')
uploaded_file = flask.request.files['file']
print uploaded_file
media.add_for_upload(uploaded_file, _upload_dir)
return flask.redirect(flask.url_for('_main'))
Run Code Online (Sandbox Code Playgroud)
如果我上传多个文件,它只打印集合中的第一个文件:
<FileStorage: u'test_file.mp3' ('audio/mp3')>
Run Code Online (Sandbox Code Playgroud)
有没有办法使用Flask的内置上传处理接收多个文件?谢谢你的帮助!
我需要进行API调用以上传文件以及带有文件详细信息的JSON字符串.
我试图使用python请求lib来做到这一点:
import requests
info = {
'var1' : 'this',
'var2' : 'that',
}
data = json.dumps({
'token' : auth_token,
'info' : info,
})
headers = {'Content-type': 'multipart/form-data'}
files = {'document': open('file_name.pdf', 'rb')}
r = requests.post(url, files=files, data=data, headers=headers)
Run Code Online (Sandbox Code Playgroud)
这会引发以下错误:
raise ValueError("Data must not be a string.")
ValueError: Data must not be a string
Run Code Online (Sandbox Code Playgroud)
如果我从请求中删除"文件",它就可以了.
如果我从请求中删除"数据",它就可以工作.
如果我不将数据编码为JSON,则可以正常工作.
出于这个原因,我认为错误与在同一请求中发送JSON数据和文件有关.
关于如何使这个工作的任何想法?
我有以下POST请求表单(简化):
POST /target_page HTTP/1.1
Host: server_IP:8080
Content-Type: multipart/form-data; boundary=AaaBbbCcc
--AaaBbbCcc
Content-Disposition: form-data; name="json"
Content-Type: application/json
{ "param_1": "value_1", "param_2": "value_2"}
--AaaBbbCcc
Content-Disposition: form-data; name="file"; filename="..."
Content-Type: application/octet-stream
<..file data..>
--AaaBbbCcc--
Run Code Online (Sandbox Code Playgroud)
我尝试发送POST请求requests:
import requests
import json
file = "C:\\Path\\To\\File\\file.zip"
url = 'http://server_IP:8080/target_page'
def send_request():
headers = {'Content-type': 'multipart/form-data; boundary=AaaBbbCcc'}
payload = { "param_1": "value_1", "param_2": "value_2"}
r = requests.post(url, files={'json': (None, json.dumps(payload), 'application/json'), 'file': (open(file, 'rb'), 'application/octet-stream')}, headers=headers)
print(r.content)
if __name__ == '__main__':
send_request()
Run Code Online (Sandbox Code Playgroud)
但它返回状态,400并带有以下注释:
Required request …Run Code Online (Sandbox Code Playgroud)