partageweb2 : pré-calcul de la taille de l'archive tar transmise.
authorProgfou <jean-christophe.andre@auf.org>
Thu, 5 Apr 2012 17:15:47 +0000 (00:15 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Thu, 5 Apr 2012 17:15:47 +0000 (00:15 +0700)
partageweb2/partage-compta.py

index 4dcc4be..b020006 100755 (executable)
@@ -83,6 +83,13 @@ def my_listdir(path):
     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
 
@@ -141,19 +148,29 @@ class FileBuffer():
         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):
@@ -181,10 +198,11 @@ 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),