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

时间:2014-10-10 12:59:16

标签: python python-requests

我尝试使用Requests将文件上传到表单但我从Tomcat服务器收回错误说:

  

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

阅读this answer后,我设法打印了我正在制作的请求,并在将其与浏览器中的请求进行比较时,我注意到请求有效负载{{ 1}}没有对齐,所以我猜这是我的问题。

用于POST多段编码文件的请求docs表明您可以显式覆盖文件名,content_type和标题:

name

这似乎工作正常,但如上所述,我还需要设置>>> url = 'http://httpbin.org/post' >>> files = {'file': ('report.xls', open('report.xls', 'rb'), 'application/vnd.ms-excel', {'Expires': '0'})} 以及namefilename

在GitHub repo上挖掘我在models.py中找到了content-type方法,似乎允许指定_encode_files

name

但我似乎无法使用此功能并在我的应用程序中,与上面的示例一样,我在文件引用之前指定了文件名:

rf = RequestField(name=k, data=fp.read(),
                  filename=fn, headers=fh)

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

名称是根据files词典中的键设置的。只需更改该键即可将名称字段设置为所需的值:

>>> 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--

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