pyfilestem support for upload to S3, ftp, etc.
This commit is contained in:
@@ -1 +1 @@
|
|||||||
Version 2.00.0 (2012-05-29 00:19:18) dev
|
Version 2.00.0 (2012-05-31 12:48:23) dev
|
||||||
|
|||||||
+21
-7
@@ -7750,6 +7750,7 @@ class Field(Expression):
|
|||||||
# True - put uploaded file in
|
# True - put uploaded file in
|
||||||
# <uploaddir>/<tablename>.<fieldname>/uuid_key[:2]
|
# <uploaddir>/<tablename>.<fieldname>/uuid_key[:2]
|
||||||
# directory)
|
# directory)
|
||||||
|
uploadfs=None # a pyfilesystem where to store upload
|
||||||
|
|
||||||
to be used as argument of DAL.define_table
|
to be used as argument of DAL.define_table
|
||||||
|
|
||||||
@@ -7786,6 +7787,7 @@ class Field(Expression):
|
|||||||
represent=None,
|
represent=None,
|
||||||
uploadfolder=None,
|
uploadfolder=None,
|
||||||
uploadseparate=False,
|
uploadseparate=False,
|
||||||
|
uploadfs=None,
|
||||||
compute=None,
|
compute=None,
|
||||||
custom_store=None,
|
custom_store=None,
|
||||||
custom_retrieve=None,
|
custom_retrieve=None,
|
||||||
@@ -7817,6 +7819,7 @@ class Field(Expression):
|
|||||||
self.uploadfield = uploadfield
|
self.uploadfield = uploadfield
|
||||||
self.uploadfolder = uploadfolder
|
self.uploadfolder = uploadfolder
|
||||||
self.uploadseparate = uploadseparate
|
self.uploadseparate = uploadseparate
|
||||||
|
self.uploadfs = uploadfs
|
||||||
self.widget = widget
|
self.widget = widget
|
||||||
if label is DEFAULT:
|
if label is DEFAULT:
|
||||||
self.label = fieldname.replace('_', ' ').title()
|
self.label = fieldname.replace('_', ' ').title()
|
||||||
@@ -7874,13 +7877,20 @@ class Field(Expression):
|
|||||||
elif self.db._adapter.folder:
|
elif self.db._adapter.folder:
|
||||||
path = os.path.join(self.db._adapter.folder, '..', 'uploads')
|
path = os.path.join(self.db._adapter.folder, '..', 'uploads')
|
||||||
else:
|
else:
|
||||||
raise RuntimeError, "you must specify a Field(...,uploadfolder=...)"
|
raise RuntimeError,\
|
||||||
|
"you must specify a Field(...,uploadfolder=...)"
|
||||||
if self.uploadseparate:
|
if self.uploadseparate:
|
||||||
path = os.path.join(path,"%s.%s" % (self._tablename, self.name),uuid_key[:2])
|
if self.uploadfs:
|
||||||
|
raise RuntimeError, "not supported"
|
||||||
|
path = os.path.join(path,"%s.%s" %(self._tablename, self.name),
|
||||||
|
uuid_key[:2])
|
||||||
if not os.path.exists(path):
|
if not os.path.exists(path):
|
||||||
os.makedirs(path)
|
os.makedirs(path)
|
||||||
pathfilename = os.path.join(path, newfilename)
|
pathfilename = os.path.join(path, newfilename)
|
||||||
dest_file = open(pathfilename, 'wb')
|
if self.uploadfs:
|
||||||
|
dest_file = self.uploadfs.open(newfilename, 'wb')
|
||||||
|
else:
|
||||||
|
dest_file = open(pathfilename, 'wb')
|
||||||
try:
|
try:
|
||||||
shutil.copyfileobj(file, dest_file)
|
shutil.copyfileobj(file, dest_file)
|
||||||
except IOError:
|
except IOError:
|
||||||
@@ -7904,15 +7914,19 @@ class Field(Expression):
|
|||||||
file_properties = self.retrieve_file_properties(name,path)
|
file_properties = self.retrieve_file_properties(name,path)
|
||||||
filename = file_properties['filename']
|
filename = file_properties['filename']
|
||||||
if isinstance(self.uploadfield, str): # ## if file is in DB
|
if isinstance(self.uploadfield, str): # ## if file is in DB
|
||||||
return (filename, cStringIO.StringIO(row[self.uploadfield] or ''))
|
stream = cStringIO.StringIO(row[self.uploadfield] or '')
|
||||||
elif isinstance(self.uploadfield,Field):
|
elif isinstance(self.uploadfield,Field):
|
||||||
blob_uploadfield_name = self.uploadfield.uploadfield
|
blob_uploadfield_name = self.uploadfield.uploadfield
|
||||||
query = self.uploadfield == name
|
query = self.uploadfield == name
|
||||||
data = self.uploadfield.table(query)[blob_uploadfield_name]
|
data = self.uploadfield.table(query)[blob_uploadfield_name]
|
||||||
return (filename, cStringIO.StringIO(data))
|
stream = cStringIO.StringIO(data)
|
||||||
|
elif self.uploadfs:
|
||||||
|
# ## if file is on pyfilesystem
|
||||||
|
stream = self.uploadfs.open(name, 'rb')
|
||||||
else:
|
else:
|
||||||
# ## if file is on filesystem
|
# ## if file is on regular filesystem
|
||||||
return (filename, open(os.path.join(file_properties['path'], name), 'rb'))
|
stream = open(os.path.join(file_properties['path'], name), 'rb')
|
||||||
|
return (filename, stream)
|
||||||
|
|
||||||
def retrieve_file_properties(self, name, path=None):
|
def retrieve_file_properties(self, name, path=None):
|
||||||
if self.custom_retrieve_file_properties:
|
if self.custom_retrieve_file_properties:
|
||||||
|
|||||||
Reference in New Issue
Block a user