我尝试使用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'})}
以及name
和filename
。
在GitHub repo上挖掘我在models.py中找到了content-type
方法,似乎允许指定_encode_files
:
name
但我似乎无法使用此功能并在我的应用程序中,与上面的示例一样,我在文件引用之前指定了文件名:
rf = RequestField(name=k, data=fp.read(),
filename=fn, headers=fh)
我在这里缺少什么?
答案 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
元素。