"""
Outil de partage de fichiers.
+Copyright : Agence universitaire de la Francophonie — www.auf.org
+Licence : GNU General Public Licence, version 2
+Auteur : Jean Christophe André
+Date de création : 26 août 2010
+
Depends: libapache2-mod-wsgi
Attention : le code n'est pas encore “thread-safe”...
return True
def human_size(size):
- if size <= 1: return "0 octet"
+ if size <= 1: return "%s octet" % size
if size < 1024: return "%s octets" % size
size /= 1024
if size < 1024: return "%s Kio" % size
return "%s Tio" % size
def my_cmp(name1, name2):
- m1 = re.match('[0-9]+', name1)
- m2 = re.match('[0-9]+', name2)
+ m1 = re.match('[0-9]{1,8}', name1)
+ m2 = re.match('[0-9]{1,8}', name2)
if not m1 or not m2:
return cmp(name1, name2)
n1 = int(m1.group())
files.sort(cmp=my_cmp)
return dirs, files
+def find_files(path):
+ files_list = []
+ for root, dirs, files in os.walk(path):
+ for a_file in files:
+ files_list.append(os.path.join(root, a_file))
+ return files_list
+
id_number = 0
try:
name = name.decode('utf-8')
except UnicodeDecodeError:
- name = INVALID_NAME % name.decode('latin-1')
+ name = INVALID_NAME % name.decode('iso-8859-1')
desc_file = '.' + path + '/' + dir_description_filename
if os.path.isfile(desc_file):
desc = file(desc_file).read().strip().replace('\n',' ')
try:
name = name.decode('utf-8')
except UnicodeDecodeError:
- name = INVALID_NAME % name.decode('latin-1')
+ name = INVALID_NAME % name.decode('iso-8859-1')
content.append( file_link_template % (space,
urllib.quote(prefix + path), name, human_size(file_size)) )
return content, file_size_total
self._data.append(data)
def read(self):
return ''.join(self._data)
+ def length(self):
+ return sum([len(x) for x in self._data])
-def tar_generator(path, mode='w|', bufsize=65536):
+def tar_size(files, mode='w|', bufsize=65536):
+ size = 0
buffer = FileBuffer()
- #yield 'open()\n'
tar = tarfile.open(mode=mode, fileobj=buffer, bufsize=bufsize)
- for root, dirs, files in os.walk(path):
- for name in files:
- tar.add(os.path.join(root, name), recursive=False)
- #yield '+ file: %s\n' % os.path.join(root, name)
- yield buffer.read()
- buffer.reset()
+ for a_file in files:
+ tar.add(a_file, recursive=False)
+ size += buffer.length()
+ buffer.reset()
+ tar.close()
+ size += buffer.length()
+ return size
+
+def tar_generator(files, mode='w|', bufsize=65536):
+ buffer = FileBuffer()
+ tar = tarfile.open(mode=mode, fileobj=buffer, bufsize=bufsize)
+ for a_file in files:
+ tar.add(a_file, recursive=False)
+ yield buffer.read()
+ buffer.reset()
tar.close()
- #yield 'close()\n'
yield buffer.read()
def application(environ, start_response):
start_response('200 OK', headers)
return file('.' + path)
if path.endswith('.tar') and os.path.isdir('.' + path[:-4]):
- #headers = [('Content-Type', 'text/plain; charset=utf-8'), ]
- headers = [('Content-Type', 'application/octet-stream'), ]
+ files = find_files('.' + path[:-4])
+ headers = [('Content-Type', 'application/octet-stream'),
+ ('Content-Length', str(tar_size(files)) ), ]
start_response('200 OK', headers)
- return tar_generator('.' + path[:-4])
+ return tar_generator(files)
content, size = dir_content(environ['SCRIPT_NAME'], environ['PATH_INFO'])
environ.update({
'page_title': PAGE_TITLE % human_size(size),