
cherokee at cherokee-project
Feb 9, 2010, 7:03 AM
Post #1 of 1
(96 views)
Permalink
|
|
[4220] CTK/trunk: Adds a new parameter to CTK.Uploader() so it can be also used with a
|
|
Revision: 4220 http://svn.cherokee-project.com/changeset/4220 Author: alo Date: 2010-02-09 16:03:02 +0100 (Tue, 09 Feb 2010) Log Message: ----------- Adds a new parameter to CTK.Uploader() so it can be also used with a temporal file as target. Modified Paths: -------------- CTK/trunk/CTK/Uploader.py CTK/trunk/tests/test5.py Modified: CTK/trunk/CTK/Uploader.py =================================================================== --- CTK/trunk/CTK/Uploader.py 2010-02-08 18:09:33 UTC (rev 4219) +++ CTK/trunk/CTK/Uploader.py 2010-02-09 15:03:02 UTC (rev 4220) @@ -22,6 +22,7 @@ import os import cgi +import tempfile from Server import publish, get_scgi from Widget import Widget, RenderResponse @@ -79,24 +80,47 @@ }); """ -class MyFieldStorage(cgi.FieldStorage): +# Field Storage classes +# +class FieldStorage_Direct(cgi.FieldStorage): def make_file (self, binary=None): - target_path = os.path.join (self.target_dir, self.filename) - return open (target_path, 'w+b') + self.target_path = os.path.join (self.target_dir, self.filename) + return open (self.target_path, 'w+b') +class FieldStorage_Temporal(cgi.FieldStorage): + def make_file (self, binary=None): + return self._file + + +# Internal Proxy +# class UploadRequest: - def __call__ (self, handler, target_dir, params): + def __call__ (self, handler, target_dir, params, direct): scgi = get_scgi() - # This obj writes the file right away. Beware: The - # functionality is invoked from the constructor! - MyFieldStorage.target_dir = target_dir - form = MyFieldStorage (fp=scgi.rfile, environ=scgi.env, keep_blank_values=1) + # Beware: The functionality is invoked from the constructor! + if direct: + FieldStorage_Direct.target_dir = target_dir + form = FieldStorage_Direct (fp=scgi.rfile, environ=scgi.env, keep_blank_values=1) + return handler (form['file'].filename, target_dir, + form['file'].filename, params) - return handler (form['file'].filename, target_dir, params) + # Upload to a temporal file + fd, target_path = tempfile.mkstemp (prefix='CTK_upload_', dir=target_dir) + FieldStorage_Temporal._file = os.fdopen(fd, 'w+b') + FieldStorage_Temporal._path = target_path + + form = FieldStorage_Temporal (fp=scgi.rfile, environ=scgi.env, keep_blank_values=1) + + return handler (form['file'].filename, target_dir, + FieldStorage_Temporal._path, params) + + +# Uploader CTK widget +# class Uploader (Widget): - def __init__ (self, props=None, params=None): + def __init__ (self, props=None, params=None, direct=True): Widget.__init__ (self) self._url_local = '/uploader_widget_%d' %(self.uniq_id) @@ -111,7 +135,7 @@ # Register the uploader path publish (self._url_local, UploadRequest, - handler=handler, target_dir=target_dir, params=params) + handler=handler, target_dir=target_dir, params=params, direct=direct) def Render (self): props = {'id': self.id, Modified: CTK/trunk/tests/test5.py =================================================================== --- CTK/trunk/tests/test5.py 2010-02-08 18:09:33 UTC (rev 4219) +++ CTK/trunk/tests/test5.py 2010-02-09 15:03:02 UTC (rev 4220) @@ -3,18 +3,23 @@ UPLOAD_DIR = "/tmp" -def ok (filename, target_dir, params): +def ok (filename, target_dir, target_file, params): txt = "<h1>It worked!</h1>" - txt += "<pre>%s</pre>" %(os.popen("ls -l " + os.path.join(target_dir, filename)).read()) - txt += "Params: " + str(params) + txt += "<pre>%s</pre>" %(os.popen("ls -l " + os.path.join(target_dir, target_file)).read()) + txt += "<p>Params: %s</p>" %(str(params)) + txt += "<p>Filename: %s</p>" %(filename) return txt class default: def __init__ (self): self.page = CTK.Page () + + self.page += CTK.RawHTML ("<h1>Direct Upload with params</h1>") self.page += CTK.Uploader({'handler': ok, 'target_dir': UPLOAD_DIR}, {'var':'foo'}) - self.page += CTK.Uploader({'handler': ok, 'target_dir': UPLOAD_DIR}) + self.page += CTK.RawHTML ("<h1>Temporal Upload without params</h1>") + self.page += CTK.Uploader({'handler': ok, 'target_dir': UPLOAD_DIR}, direct=False) + def __call__ (self): return self.page.Render()
|