使用urllib2上传文件

编程入门 行业动态 更新时间:2024-10-28 06:33:55
本文介绍了使用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上传文件

本文发布于:2023-10-10 01:05:26,感谢您对本站的认可!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:上传文件

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!