Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python请求-发布包含多部分/表单数据的zip文件_Python_Post_Python Requests - Fatal编程技术网

Python请求-发布包含多部分/表单数据的zip文件

Python请求-发布包含多部分/表单数据的zip文件,python,post,python-requests,Python,Post,Python Requests,我正在玩Python请求模块,到目前为止,它一直是一种乐趣 但是,我在尝试使用多部分/表单数据发布zip文件时遇到了一个问题 我正在使用摘要身份验证,并且能够成功发布其他文件类型,例如.xls等 我正在使用以下命令创建post请求: file = open('/Users/.../test.zip', 'rb').read() r = requests.post(url, auth=HTTPDigestAuth('dev', 'dev'), data = {"mysubmit":"Go"}, f

我正在玩Python请求模块,到目前为止,它一直是一种乐趣

但是,我在尝试使用多部分/表单数据发布zip文件时遇到了一个问题

我正在使用摘要身份验证,并且能够成功发布其他文件类型,例如.xls等

我正在使用以下命令创建post请求:

file = open('/Users/.../test.zip', 'rb').read()
r = requests.post(url, auth=HTTPDigestAuth('dev', 'dev'), data = {"mysubmit":"Go"}, files={"archive": ("test.zip", file)})
这会出错,并给出:

requests.exceptions.ConnectionError: HTTPConnectionPool(host='10.2.2.70', port=80): Max retries exceeded with url: /plugin_install 
(Caused by <class 'socket.error'>: [Errno 32] Broken pipe)
requests.exceptions.ConnectionError:HTTPConnectionPool(host='10.2.2.70',port=80):url:/plugin\u安装超过最大重试次数
(由:[Errno 32]管道破裂引起)
我尝试过使用较小大小的zip文件并更改数据/文件值,但也出现了相同的错误

我错过了什么明显的东西吗


谢谢你能给我带来的一切

请求而言,zip文件和任何其他二进制数据块之间没有区别

你的服务器在这里坏了;当您发送zip文件时,它会切断连接。这是
请求
无法解决的问题

您可能需要针对
http://httpbin.org/
当你遇到这样的问题时;它是由
请求
库的作者构建的测试服务

另一个提示:发送时不需要将整个文件对象读入内存。只需将对象本身传递给
请求

fileobj = open('/Users/.../test.zip', 'rb')
r = requests.post(url, auth=HTTPDigestAuth('dev', 'dev'), data = {"mysubmit":"Go"}, files={"archive": ("test.zip", fileobj)})
针对httpbin.org的演示:

>>> import requests
>>> fileobj = open('/tmp/test.zip', 'rb')
>>> r = requests.post('http://httpbin.org/post', data={"mysubmit":"Go"}, files={"archive": ("test.zip", fileobj)})
>>> r
<Response [200]>
>>> r.json()
{u'origin': u'217.32.203.188', u'files': {u'archive': u'data:application/zip;base64,<long base64 body omitted>'}, u'form': {u'mysubmit': u'Go'}, u'url': u'http://httpbin.org/post', u'args': {}, u'headers': {u'Content-Length': u'57008', u'Accept-Encoding': u'gzip, deflate, compress', u'Connection': u'close', u'Accept': u'*/*', u'User-Agent': u'python-requests/1.2.3 CPython/2.7.5 Darwin/12.4.0', u'Host': u'httpbin.org', u'Content-Type': u'multipart/form-data; boundary=9aec1d03a1794177a38b48416dd4c811'}, u'json': None, u'data': u''}
导入请求 >>>fileobj=open('/tmp/test.zip','rb') >>>r=请求。post('http://httpbin.org/post,数据={“mysubmit”:“Go”},文件={“archive”:(“test.zip”,fileobj)}) >>>r >>>r.json() {u'origin':u'217.32.203.188',u'files':{u'archive':u'data:application/zip;base64'},u'form':{u'mysubmit':u'Go'},u'url':u'http://httpbin.org/post“,u'args':{},u'headers':{u'Content-Length':u'57008',u'Accept-Encoding':u'gzip,deflate,compress',u'Connection':u'close',u'Accept':u'*/*',u'User-Agent':u'python-requests/1.2.3 CPython/2.7.5 Darwin/12.4.0',u'Host':u'httpbin.org',u'Content-Type':u'multipart/form data;boundary=9aec1d03a1794177a38b48416dd4c811',,u'json':无,u'data'}
请注意,您可以直接发送文件对象,但仍然可以使用元组来提供文件名。@Lukasa:快速重新测试,很明显我犯了错误;我一定已经阅读了文件对象,忘记了返回到0。感谢您的回复!您的澄清确实有帮助,因为我现在可以成功发布小zip文件。我仍然但是,在发布任何大于98 KB的zip时,似乎出现了该错误。这可能是一个请求/urllib3超时/内容长度问题吗?@BenjiBarash:不,这仍然是一个服务器端问题。我以前使用的一个名为Poster的库没有提示服务器出现这些问题。Poster称为函数multipart\u encode然后我将使用urllib2.Request和它生成的数据。我找到了请求,因为Poster在使用Digest Auth时遇到了多部分/表单数据问题。您是否使用
s=Request.Session;s.Auth…;s.post(…)