i'm new python , i'm writing code upload file using urllib2 can't make work.
here's 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 e: if hasattr(e, 'reason'): print 'error accessing server.' print 'reason: ', e.reason elif hasattr(e, 'code'): print 'the server couldn\'t fulfill 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): 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 = "" open(path,'rb') 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 working fine now.
class post(get): # inherits class above def __init__(self,url,data,multipart=false): super(http.post,self).__init__(url) if multipart: multipartposthandler import multipartposthandler self._add_handler(multipartposthandler) self.request.add_data(data) else: self.request.add_data(urlencode(data))
Comments
Post a Comment