使用urllib2上传文件 [英] uploading file using urllib2
本文介绍了使用urllib2上传文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我是python的新手,我正在编写一个使用urllib2上传文件的代码,但是我无法完成它。
这是代码:
class Get(object):
handlers = list()
def __init __(self,url) :
self.url = url
self.request = urllib2.Request(url)
self.request.add_header('User-Agent',Mozilla / 5.0(X11; U; Linux (自我,用户名,密码):
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm($ i $; )
pass_mgr.add_password(None,self.url,username,password)
handler = urllib2.HTTPBasicAuthHandler(pass_mgr)
self._add_handler(处理程序)
def (self):
try:
opener = self._opener()
res = opener.open(self.request)
to_return = {
'code' :res.code,
'conte nts':res.read(),
'url':res.geturl(),
'headers':dict(res.info())
}
除了urllib2 .URLError as e:
如果hasattr(e,'reason'):
print'访问服务器时出错'
print'Reason:',e.reason
elif hasattr (e,'code'):
print'服务器不能完成请求'
print e
else:
return to_return
def _add_handler(self,handler):
self.handlers.append(handler)
$ b def _opener(self):
return urllib2.build_opener(* self.handlers)
$ b $ class Multipart(object):
def __init __(self,url):
super(Multipart,self).__ init __(url)
self.data = list ()
$ b $ def表达式(self):
b = choose_boundary()
tmp =.join(map(lambda x: - %s \r\\\
%s%(b,x),self.data))
tmp + = - %s - \r\\\
%b
self.request.add_data(tmp)
content_type ='multipart / form-data; border =%s'%b
self.request.add_unredirected_header('Content-Type',content_type)
#self.request.add_header(Content-Type,multipart / form-data,boundary =%s%b)
返回超级(HTTP.Multipart,self).perform()
def set_data(self,data,file = None):
for i在数据中:
if file:
self.data.append(self._encode_file(i,** data [i]))
else:
self.data.append( self._encode_text(i,data [i]))
$ b $ def _encode_text(self,key,value):
returnContent-Disposition:form-data; name = \% \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'无,mime_type =无):
如果不存在(路径):
运行时错误('%s未找到'%路径)
fname =文件名或基本名(路径)
mime = mime_type或guess_type(路径)[0]或'applicati
size = getsize(path)
content =
with open(path,'rb')as fobj:
content = fobj.read大小)
converted_text =内容处理:表单数据;名称= \ %s\;文件名= \%s\\r\\\
%(key,fname)
converted_text + =Content-Transfer-Encoding:binary \r\\\
converted_text + =Content-Type:%s \r\\\
%mime
converted_text + =Content-Length:%s \r\\\
%size
converted_text + =\\ \\ r \%s \r\\\
%content
return converted_text
感谢 MultipartPostHandler 现在一切正常。
class Post(Get):#继承$ b $上面的Get类def __init __(self,url,data,multipart = False):
super(HTTP.Post,self).__ init __(url )
multipart:
from MultipartPostHandler import MultipartPostHandler
self._add_handler(MultipartPostHandler)
self.request.add_data(data)
else:
self。 request.add_data(urlencode(data))
I'm new to python and I'm writing a code to upload a file using urllib2 but I can't make it work.
Here's the code:
class Get(object):
handlers = list()
def __init__(self,url):
self.url = url
self.request = urllib2.Request(url)
self.request.add_header('User-Agent',"Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13")
def auth(self,username,password):
pass_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
pass_mgr.add_password(None, self.url, username, password)
handler = urllib2.HTTPBasicAuthHandler(pass_mgr)
self._add_handler(handler)
def perform(self):
try:
opener = self._opener()
res = opener.open(self.request)
to_return = {
'code': res.code,
'contents': res.read(),
'url': res.geturl(),
'headers': dict(res.info())
}
except urllib2.URLError as e:
if hasattr(e, 'reason'):
print 'Error accessing the server.'
print 'Reason: ', e.reason
elif hasattr(e, 'code'):
print 'The server couldn\'t fulfill the request.'
print e
else:
return to_return
def _add_handler(self,handler):
self.handlers.append(handler)
def _opener(self):
return urllib2.build_opener(*self.handlers)
class Multipart(object):
def __init__(self,url):
super(Multipart,self).__init__(url)
self.data = list()
def perform(self):
b = choose_boundary()
tmp = "".join(map(lambda x: "--%s \r\n %s" % (b,x), self.data ))
tmp += "--%s--\r\n" % b
self.request.add_data(tmp)
content_type = 'multipart/form-data; boundary=%s' % b
self.request.add_unredirected_header('Content-Type', content_type)
#self.request.add_header("Content-Type","multipart/form-data, boundary=%s" % b)
return super(HTTP.Multipart,self).perform()
def set_data(self,data,file = None):
for i in data:
if file:
self.data.append(self._encode_file(i,**data[i]))
else:
self.data.append(self._encode_text(i,data[i]))
def _encode_text(self,key,value):
return "Content-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n" % (key, value)
def _encode_file(self,key,path,filename=None,mime_type=None):
if not exists(path):
raise RuntimeError('%s not found' % path)
fname = filename or basename(path)
mime = mime_type or guess_type(path)[0] or 'application/octet-stream'
size = getsize(path)
content = ""
with open(path,'rb') as fobj:
content = fobj.read(size)
converted_text = "Content-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\n" % (key,fname)
converted_text += "Content-Transfer-Encoding: binary\r\n"
converted_text += "Content-Type: %s \r\n" % mime
converted_text += "Content-Length: %s \r\n" % size
converted_text += "\r\n %s \r\n" % content
return converted_text
解决方案
Thanks MultipartPostHandler everything is working fine now.
class Post(Get): # inherits the Get class above
def __init__(self,url,data,multipart=False):
super(HTTP.Post,self).__init__(url)
if multipart:
from MultipartPostHandler import MultipartPostHandler
self._add_handler(MultipartPostHandler)
self.request.add_data(data)
else:
self.request.add_data(urlencode(data))
这篇关于使用urllib2上传文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文