Mercurial > hg > uploader
view uploader/handlers.py @ 13:b8c636b0b567
make work for non pastescript frameworks
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Tue, 05 Jul 2011 23:37:52 -0700 |
parents | 40b76777a880 |
children | 916d45d4f921 |
line wrap: on
line source
import os from urlparse import urlparse from webob import Response, exc class Handler(object): def __init__(self, app, request): self.app = app self.request = request self.application_path = urlparse(request.application_url)[2] def link(self, path=(), permanant=False): if isinstance(path, basestring): path = [ path ] path = [ i.strip('/') for i in path ] if permanant: application_url = [ self.request.application_url ] else: application_url = [ self.application_path ] path = application_url + path return '/'.join(path) def redirect(self, location): return exc.HTTPSeeOther(location=location) class Get(Handler): form = """<form name="upload_form" method="post" enctype="multipart/form-data"> <input type="file" name="file"/><input type="submit" value="upload"/></form></body></html>""" @classmethod def match(cls, app, request): if app.query_string and (app.query_string not in request.GET): return False return request.method == 'GET' def __call__(self): form = "<html><body>" if 'uploaded' in self.request.GET: form += '<div>%s uploaded successfully</div>' % self.request.GET['uploaded'] form += self.form + '</body></html>' return Response(content_type='text/html', body=form) class Post(Handler): @classmethod def match(cls, app, request): return request.method == 'POST' def write(self, fin, path): assert os.sep not in fin.filename assert '..' not in fin.filename fout = file(path, 'w') fout.write(fin.file.read()) fout.close() def __call__(self): fin = self.request.POST['file'] _path = os.path.join(self.app.directory, fin.filename) self.write(fin, _path) return self.redirect(self.link('/?uploaded=' + fin.filename)) def path(directory, request): if os.sep == '/': return os.path.join(directory, request.path_info.strip('/')) return os.path.join(directory, *request.path_info.strip('/').split('/')) class SubpathGet(Get): @classmethod def match(cls, app, request): if not Get.match(app, request): return False _path = path(app.directory, request) if os.path.exists(_path) and os.path.isdir(_path): return True class SubpathPost(Post): @classmethod def match(cls, app, request): if request.method != 'POST': return False _path = path(app.directory, request) if os.path.exists(_path) and os.path.isdir(_path): return True def __call__(self): fin = self.request.POST['file'] _path = path(self.app.directory, self.request) _path = os.path.join(_path, fin.filename) self.write(fin, _path) return self.redirect(self.link(self.request.path_info))