Python 中的复杂 POST 请求 -- 多部分文件 -- 解包的值太多

Dhr*_*esh 1 python post multipartform-data python-3.x python-requests

我正在尝试以以下模式将一些文件和参数作为多部分发布。我试过字典和列表。list扔了一个HTTP 415。所以我继续前进dict。我想以通用名称“文件”(以及它们各自的文件名)发布一些参数以及多个文件。

字符串参数工作正常,错误在于文件上传

在多部分 dict 对象中传递的数据

multipart = {
    'param1': 'paramVal1',
    'param2': 'paramVal2',
    'file': (("file1.xml", ByteIO), ("file1.xml", ByteIO)),
}
Run Code Online (Sandbox Code Playgroud)

POST 使用 python-requests

requests.post(url='http://localhost:8888/upload',files=multipart)
Run Code Online (Sandbox Code Playgroud)

抛出错误

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)
Run Code Online (Sandbox Code Playgroud)

预期的 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--
Run Code Online (Sandbox Code Playgroud)

t.m*_*dam 6

由于两个文件项具有相同的名称,因此您不能使用字典,但可以在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)
Run Code Online (Sandbox Code Playgroud)

请求正文:

--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--
Run Code Online (Sandbox Code Playgroud)