2009-06-08 8 views
6

Kann ich dynamisch generierten Inhalt, z. B. eine frisch gerenderte HTML-Vorlage, in eine Zip-Datei mit zipfile komprimieren?Zippen von dynamischen Dateien in App Engine (Python)

Es scheint einige Beispiele zum Zippen von statischem Inhalt zu geben, aber keine zum Zippen von dynamischen. Oder ist das überhaupt nicht möglich?

Eine weitere Frage: Ist es möglich, eine Zip-Datei mit einer Reihe von Unterordnern darin zu erstellen?

Danke.

Antwort

7

Sie können, was Sie zu einer ZIP-Datei ZipFile.writestr() mit möchte hinzufügen:

my_data = "<html><body><p>Hello, world!</p></body></html>" 
z.writestr("hello.html", my_data) 

Sie auch Unterordner können mit / (oder os.sep) als Trennzeichen:

z.writestr("site/foo/hello/index.html", my_data) 
+0

Ihr Jungs rockt! Danke vielmals. – checker659

3

Zusätzlich Nach Schnouki's ausgezeichneter Antwort können Sie ZipFile auch ein dateiähnliches Objekt übergeben, wie eines, das von StringIO.StringIO erstellt wurde.

+0

Danke Ryan! _ – checker659

+0

Wenn Sie Python 3 verwenden, muss es io.BytesIO (StringIO-Modul ist weg, und Zipfile erwartet einen Byte-Puffer) –

+1

Hoppla, habe gerade festgestellt, dass es sich um App Engine handelt. Du solltest meinen letzten Kommentar wahrscheinlich ignorieren :), sorry. –

14

Der Arbeitscode (für App Engine :)

output = StringIO.StringIO() 
z = zipfile.ZipFile(output,'w') 
my_data = "<html><body><p>Hello, world!</p></body></html>" 
z.writestr("hello.html", my_data) 
z.close() 

self.response.headers["Content-Type"] = "multipart/x-zip" 
self.response.headers['Content-Disposition'] = "attachment; filename=test.zip" 
self.response.out.write(output.getvalue()) 

Nochmals vielen Dank an Schnouki und Ryan.