使用urllib2上传文件 [英] uploading file using urllib2

查看:215
本文介绍了使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆