复杂 POST 请求 Python -- 多部分文件 -- 太多值无法解压
Complex POST Request In Python -- Multipart Files -- too many values to unpack
我正在尝试 POST 以下模式中的一些文件和参数作为多部分。我已经尝试过 dict 和 list。 list
扔了一个 HTTP 415
。所以我继续 dict
。我想 post 一些参数以及多个文件的通用名称 'file'(连同它们各自的文件名)。
字符串参数工作正常,错误是文件上传
在多部分字典对象中传递的数据
multipart = {
'param1': 'paramVal1',
'param2': 'paramVal2',
'file': (("file1.xml", ByteIO), ("file1.xml", ByteIO)),
}
POST 使用 python-requests
requests.post(url='http://localhost:8888/upload',files=multipart)
抛出错误
File "C:\Python36\lib\site-packages\requests\api.py", line 107, in post
return request('post', url, data=data, json=json, **kwargs)
File "C:\Python36\lib\site-packages\requests\api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python36\lib\site-packages\requests\sessions.py", line 454, in request
prep = self.prepare_request(req)
File "C:\Python36\lib\site-packages\requests\sessions.py", line 388, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "C:\Python36\lib\site-packages\requests\models.py", line 296, in prepare
self.prepare_body(data, files, json)
File "C:\Python36\lib\site-packages\requests\models.py", line 447, in prepare_body
(body, content_type) = self._encode_files(files, data)
File "C:\Python36\lib\site-packages\requests\models.py", line 142, in _encode_files
fn, fp, ft, fh = v
ValueError: too many values to unpack (expected 4)
预期POST正文
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="file"; filename="file1.xml"
Content-Type: text/xml
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="file"; filename="file2.xml"
Content-Type: text/xml
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="param1"
paramVal1
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="param2"
paramVal2
------WebKitFormBoundaryZ7HAof4KTgAB21YV--
由于两个文件项的名称相同,因此您不能使用字典,但可以在 files
参数中使用元组列表。
对于其余的表单数据,请使用 data
参数。
data = {
'param1': 'paramVal1',
'param2': 'paramVal2'
}
files = [
("file", ("file1.xml", open("file1.xml", "rb"), "text/xml")),
("file", ("file2.xml", open("file2.xml", "rb"), "text/xml"))
]
r = requests.post(url='http://localhost:8888/upload', data=data, files=files)
print(r.request.body)
请求正文:
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="param2"
paramVal2
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="param1"
paramVal1
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="file"; filename="file1.xml"
Content-Type: text/xml
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="file"; filename="file2.xml"
Content-Type: text/xml
--85d945c02ac04c9fbdcd9979e34e6d04--
我正在尝试 POST 以下模式中的一些文件和参数作为多部分。我已经尝试过 dict 和 list。 list
扔了一个 HTTP 415
。所以我继续 dict
。我想 post 一些参数以及多个文件的通用名称 'file'(连同它们各自的文件名)。
字符串参数工作正常,错误是文件上传
在多部分字典对象中传递的数据
multipart = {
'param1': 'paramVal1',
'param2': 'paramVal2',
'file': (("file1.xml", ByteIO), ("file1.xml", ByteIO)),
}
POST 使用 python-requests
requests.post(url='http://localhost:8888/upload',files=multipart)
抛出错误
File "C:\Python36\lib\site-packages\requests\api.py", line 107, in post
return request('post', url, data=data, json=json, **kwargs)
File "C:\Python36\lib\site-packages\requests\api.py", line 53, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Python36\lib\site-packages\requests\sessions.py", line 454, in request
prep = self.prepare_request(req)
File "C:\Python36\lib\site-packages\requests\sessions.py", line 388, in prepare_request
hooks=merge_hooks(request.hooks, self.hooks),
File "C:\Python36\lib\site-packages\requests\models.py", line 296, in prepare
self.prepare_body(data, files, json)
File "C:\Python36\lib\site-packages\requests\models.py", line 447, in prepare_body
(body, content_type) = self._encode_files(files, data)
File "C:\Python36\lib\site-packages\requests\models.py", line 142, in _encode_files
fn, fp, ft, fh = v
ValueError: too many values to unpack (expected 4)
预期POST正文
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="file"; filename="file1.xml"
Content-Type: text/xml
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="file"; filename="file2.xml"
Content-Type: text/xml
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="param1"
paramVal1
------WebKitFormBoundaryZ7HAof4KTgAB21YV
Content-Disposition: form-data; name="param2"
paramVal2
------WebKitFormBoundaryZ7HAof4KTgAB21YV--
由于两个文件项的名称相同,因此您不能使用字典,但可以在 files
参数中使用元组列表。
对于其余的表单数据,请使用 data
参数。
data = {
'param1': 'paramVal1',
'param2': 'paramVal2'
}
files = [
("file", ("file1.xml", open("file1.xml", "rb"), "text/xml")),
("file", ("file2.xml", open("file2.xml", "rb"), "text/xml"))
]
r = requests.post(url='http://localhost:8888/upload', data=data, files=files)
print(r.request.body)
请求正文:
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="param2"
paramVal2
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="param1"
paramVal1
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="file"; filename="file1.xml"
Content-Type: text/xml
--85d945c02ac04c9fbdcd9979e34e6d04
Content-Disposition: form-data; name="file"; filename="file2.xml"
Content-Type: text/xml
--85d945c02ac04c9fbdcd9979e34e6d04--