Force FieldStorage to write tempfiles and never use StringIOs.

This commit is contained in:
Nate Coraor
2009-08-21 09:56:35 -04:00
parent bf9666bf21
commit ec24e945cb
2 changed files with 13 additions and 8 deletions
+4 -6
View File
@@ -20,12 +20,10 @@ class UploadToolAction( ToolAction ):
for upload_dataset in incoming['files']:
f = upload_dataset['file_data']
if isinstance( f, FieldStorage ):
# very small files can be StringIOs
if 'name' in dir( f.file ) and f.file.name != '<fdopen>':
local_filename = util.mkstemp_ln( f.file.name, 'upload_file_data_' )
f.file.close()
else:
local_filename = datatypes.sniff.stream_to_file( f.file, prefix="strio_upload_file_" )[0]
assert not isinstance( f.file, StringIO.StringIO )
assert f.file.name != '<fdopen>'
local_filename = util.mkstemp_ln( f.file.name, 'upload_file_data_' )
f.file.close()
upload_dataset['file_data'] = dict( filename = f.filename,
local_filename = local_filename )
if upload_dataset['url_paste'].strip() != '':
+9 -2
View File
@@ -216,11 +216,18 @@ class DefaultWebTransaction( object ):
# tempfiles. Necessary for externalizing the upload tool. It's a little hacky
# but for performance reasons it's way better to use Paste's tempfile than to
# create a new one and copy.
import cgi
import cgi, tempfile
class FieldStorage( cgi.FieldStorage ):
def make_file(self, binary=None):
import tempfile
return tempfile.NamedTemporaryFile()
def read_lines(self):
# Always make a new file
self.file = self.make_file()
self.__file = None
if self.outerboundary:
self.read_lines_to_outerboundary()
else:
self.read_lines_to_eof()
cgi.FieldStorage = FieldStorage
class Request( webob.Request ):