Python 设置多部分编码文件POST的名称标头

Python 设置多部分编码文件POST的名称标头,python,python-requests,Python,Python Requests,我试图使用将文件上载到表单,但从Tomcat服务器返回一个错误,错误是: 客户端发送的请求在语法上不正确 阅读后,我设法打印了我正在发出的请求,当与浏览器中发出的请求进行比较时,我注意到请求负载name未对齐,因此我猜这是我的问题 发布多部分编码文件的请求表明,您可以显式覆盖文件名、内容类型和标题: >>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('rep

我试图使用将文件上载到表单,但从Tomcat服务器返回一个错误,错误是:

客户端发送的请求在语法上不正确

阅读后,我设法打印了我正在发出的请求,当与浏览器中发出的请求进行比较时,我注意到请求负载
name
未对齐,因此我猜这是我的问题

发布多部分编码文件的请求表明,您可以显式覆盖文件名、内容类型和标题:

>>> url = 'http://httpbin.org/post'
>>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})}
这似乎很好,但如上所述,我还需要设置
名称
以及
文件名
内容类型

在GitHub repo上,我找到了
\u encode\u files
方法,其中似乎允许指定
名称

rf = RequestField(name=k, data=fp.read(),
                  filename=fn, headers=fh)
但我似乎无法实现这一点,在我的应用程序中,与上面的示例一样,我在引用文件之前指定了文件名:

files = {'file': (filename, open(filePath, 'rb'), 'application/x-zip-compressed')}

我在这里遗漏了什么?

名称是从您的
文件中的键设置的。只需更改该键即可将名称字段设置为所需的值:

>>> import requests
>>> files = {'foobar': ('foo.txt', 'foo\ncontents\n','text/plain')}
>>> req = requests.Request('POST', 'http://httpbin.org/post', files=files).prepare()
>>> print req.body
--49773910d9514216894b697cb70e9f21
Content-Disposition: form-data; name="foobar"; filename="foo.txt"
Content-Type: text/plain

foo
contents

--49773910d9514216894b697cb70e9f21--

请注意每个部分
Content Disposition
标题的
name=“foobar”
元素。

我简直不敢相信我没有发现这一点。谢谢