2009-06-08 14 views
6

Esiste comunque la possibilità di comprimere contenuti generati dinamicamente, come un modello html appena renderizzato, in un file zip utilizzando zipfile?Zippare file dinamici in App Engine (Python)

Sembra che ci siano alcuni esempi in giro per zippare il contenuto statico, ma nessuno per zippare quelli dinamici. Oppure, non è affatto possibile?

Un'altra domanda: è possibile creare un file zip con un gruppo di sottocartelle al suo interno?

Grazie.

risposta

7

È possibile aggiungere quello che vuoi in un file zip utilizzando ZipFile.writestr():

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

È inoltre possibile utilizzare sotto-cartelle utilizzando / (o os.sep) come separatore:

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

Ragazzi, rock! Molte grazie. – checker659

3

Inoltre all'eccellente risposta di Schnouki, puoi anche passare a ZipFile un oggetto simile a un file, come ad esempio uno creato da StringIO.StringIO.

+0

Grazie Ryan! _ – checker659

+0

Se si utilizza Python 3, deve essere io.BytesIO (il modulo StringIO non c'è più, e zipfile si aspetta un buffer byte) –

+1

Oops, ho appena realizzato che si tratta di App Engine. Probabilmente dovresti ignorare il mio ultimo commento :), mi dispiace. –

14

Il codice di lavoro: (per il motore app :)

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()) 

Grazie ancora a Schnouki e Ryan.