Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Zipping dynamic files in App Engine (Python)

Is there anyway I can zip dynamically generated content, such as a freshly rendered html template, into a zip file using zipfile?

There seem to be some examples around for zipping static content, but none for zipping dynamic ones. Or, is it not possible at all?

One more question: Is it possible to create a zip file with a bunch of sub-folders inside it?

Thanks.

like image 516
checker659 Avatar asked Jun 08 '09 07:06

checker659


3 Answers

The working code: (for 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())

Thanks again to Schnouki and Ryan.

like image 95
checker659 Avatar answered Nov 03 '22 09:11

checker659


You can add whatever you want to a zip file using ZipFile.writestr():

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

You can also use sub-folders using / (or os.sep) as a separator:

z.writestr("site/foo/hello/index.html", my_data)
like image 7
Schnouki Avatar answered Nov 03 '22 07:11

Schnouki


In addition to Schnouki's excellent answer, you can also pass ZipFile a file-like object, such as one created by StringIO.StringIO.

like image 3
Ryan Ginstrom Avatar answered Nov 03 '22 08:11

Ryan Ginstrom