2009-06-08 10 views
6

De toute façon, puis-je compresser du contenu généré dynamiquement, comme un modèle html fraîchement rendu, dans un fichier zip à l'aide de fichier zip?Compresser des fichiers dynamiques dans App Engine (Python)

Il semble y avoir quelques exemples pour compresser le contenu statique, mais aucun pour compresser les fichiers dynamiques. Ou, n'est-ce pas possible du tout?

Encore une question: Est-il possible de créer un fichier zip avec un tas de sous-dossiers à l'intérieur?

Merci.

Répondre

7

Vous pouvez ajouter tout ce que vous voulez un fichier zip en utilisant ZipFile.writestr():

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

Vous pouvez également utiliser des sous-dossiers à l'aide / (ou os.sep) comme séparateur:

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

Vous avez du rock! Merci beaucoup. – checker659

3

En plus à l'excellente réponse de Schnouki, vous pouvez également passer à ZipFile un objet semblable à un fichier, tel que celui créé par StringIO.StringIO.

+0

Merci Ryan! _ – checker659

+0

Si vous utilisez Python 3, il doit être io.BytesIO (le module StringIO est parti, et zipfile attend un tampon d'octets) –

+1

Oops, vient de réaliser qu'il s'agit d'App Engine. Vous devriez probablement ignorer mon dernier commentaire :), désolé. –

14

Le code de travail: (pour le moteur 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()) 

Merci encore à Schnouki et Ryan.