python urllib2文件发送问题
我想通过python将一个文件发布到服务器,为此我需要将该文件命名为“xmlfile”,以便服务器识别输入python urllib2文件发送问题,python,curl,urllib2,Python,Curl,Urllib2,我想通过python将一个文件发布到服务器,为此我需要将该文件命名为“xmlfile”,以便服务器识别输入 import urllib2 url = "http://somedomain" to_send = open('test.xml').read() data = {} data['xmlfile'] = to_send f = urllib2.urlopen(url, data) 这不起作用,另外,如何检索响应并保存到某个地方 换句话说,我想像处理Curl一样执行操作: curl.e
import urllib2
url = "http://somedomain"
to_send = open('test.xml').read()
data = {}
data['xmlfile'] = to_send
f = urllib2.urlopen(url, data)
这不起作用,另外,如何检索响应并保存到某个地方
换句话说,我想像处理Curl一样执行操作:
curl.exe http://somedomain -F xmlfile=@test.xml -o response.html
我刚读了尼姆提到的问题。一个答案提到海报模块。 此模块可以进行
多部分/表单数据编码
,因此,如果向项目添加另一个依赖项不是问题,我将使用poster模块
这并不像应该的那么简单。有一个代码片段漂浮在网络上,我用它来编写代码,它做到了这一点。您可能需要根据自己的需要对其进行调整
class RequestWithMethod(urllib2.Request):
def __init__(self, method, *args, **kwargs):
self._method = method
urllib2.Request.__init__(self, *args, **kwargs)
def get_method(self):
return self._method
class RestRequest(object):
def __init__(self, base_url):
self.base_url = base_url
def request(self, url, method, headers={"Accept" : "application/json"}, data=None, json_response=True):
request = RequestWithMethod(url='{0}{1}{2}'.format(self.base_url, root_url(), url),
method=method,
headers=headers)
if data != None:
data = urllib.urlencode(data)
response = urllib2.urlopen(request, data=data).read()
if json_response:
return from_json(response)
else:
return response
def GET(self, url, **kwargs):
return self.request(url, 'GET', **kwargs)
def POST(self, url, **kwargs):
return self.request(url, 'POST', **kwargs)
def POST_FILE(self, url, file, headers={"Accept" : "application/json"}, data={}, **kwargs):
content_type, body = encode_multipart_formdata(data, file)
headers['Content-type'] = content_type
headers['Content-length'] = str(len(body))
request = RequestWithMethod(url='{0}{1}{2}'.format(self.base_url, root_url(), url),
data=body,
method='POST',
headers=headers)
return from_json(urllib2.urlopen(request).read())
def PUT(self, url, **kwargs):
return self.request(url, 'PUT', **kwargs)
def DELETE(self, url, **kwargs):
return self.request(url, 'DELETE', **kwargs)
def encode_multipart_formdata(data, file):
boundary = '----------ThIs_Is_tHe_bouNdaRY_$'
L = []
for key, value in data.items():
L.append('--' + boundary)
L.append('Content-Disposition: form-data; name="{0}"'.format(key))
L.append('')
L.append(value)
key, filename, value = file
L.append('--' + boundary)
L.append('Content-Disposition: form-data; name="{0}"; filename="{1}"'.format(key, filename))
content_type = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
L.append('Content-Type: {0}'.format(content_type))
L.append('')
L.append(value)
L.append('--' + boundary + '--')
L.append('')
body = '\r\n'.join(L)
content_type = 'multipart/form-data; boundary={0}'.format(boundary)
return content_type, body
看看或直接看看它的代码
urllib
通常使用应用程序/x-www-form-urlencoded
内容类型发送数据,而您需要多部分/表单数据。参考库根据需要对数据进行编码。可能重复的