dynamically creating zip file, returning to user
Zope 2.8.0, Python 2.3.5 I'm having a heck of a time figuring out how to zip up some files in my zope instance and return them to the user. I can sucessfully create a zip file on the local file system, but if I try to pass it back to the user it is corrupted. Of course I'd rather not create this tmp3.zip file, so if there's a way around that (which I'm sure there is!) please do let me know. filename = 'test.zip' response = self.REQUEST.RESPONSE response.setHeader('Content-Type','application/zip') response.setHeader('Content-Disposition','attachment; filename=%s' % filename) # tried zf = zipfile.ZipFile( response, 'w' ) but get error, ZHTTP object doesn't have tell method zf = zipfile.ZipFile( '/tmp3.zip', 'w' ) zf.writestr( 'testfilename', str( self._getOb( testfileid ) ) ) zf.close() f = open('/tmp3.zip') return f.read() Any thoughts on what fairly obvious thing I'm doing wrong? Thanks! John
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 John Toews wrote:
Zope 2.8.0, Python 2.3.5
I'm having a heck of a time figuring out how to zip up some files in my zope instance and return them to the user. I can sucessfully create a zip file on the local file system, but if I try to pass it back to the user it is corrupted. Of course I'd rather not create this tmp3.zip file, so if there's a way around that (which I'm sure there is!) please do let me know.
filename = 'test.zip' response = self.REQUEST.RESPONSE response.setHeader('Content-Type','application/zip') response.setHeader('Content-Disposition','attachment; filename=%s' % filename) # tried zf = zipfile.ZipFile( response, 'w' ) but get error, ZHTTP object doesn't have tell method zf = zipfile.ZipFile( '/tmp3.zip', 'w' ) zf.writestr( 'testfilename', str( self._getOb( testfileid ) ) ) zf.close() f = open('/tmp3.zip') return f.read()
Any thoughts on what fairly obvious thing I'm doing wrong? Thanks!
A couple of thoughts: - Be sure you open the file in binary mode ('wb' rather than 'w'); this won't help unless you are running Zope on Windows, however, because Windows is the only platform where the C runtime will mangle the line endings for files it thinks are "text", rather than "binary". - You could use a StringIO instance, rather than a tempfile; YMMV. Tres. - -- =================================================================== Tres Seaver +1 202-558-7113 tseaver@palladion.com Palladion Software "Excellence by Design" http://palladion.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://enigmail.mozdev.org iD8DBQFDvI6r+gerLs4ltQ4RAvrMAJ9oH0gtorWuW6NeowfVCfZ6PbyYSgCfbCHd 8VhNtnUrBeEiIp8sSLSVQOg= =f+qw -----END PGP SIGNATURE-----
John Toews schrieb:
Zope 2.8.0, Python 2.3.5
I'm having a heck of a time figuring out how to zip up some files in my zope instance and return them to the user. I can sucessfully create a zip file on the local file system, but if I try to pass it back to the user it is corrupted. Of course I'd rather not create this tmp3.zip file, so if there's a way around that (which I'm sure there is!) please do let me know.
filename = 'test.zip' response = self.REQUEST.RESPONSE response.setHeader('Content-Type','application/zip') response.setHeader('Content-Disposition','attachment; filename=%s' % filename) # tried zf = zipfile.ZipFile( response, 'w' ) but get error, ZHTTP object doesn't have tell method zf = zipfile.ZipFile( '/tmp3.zip', 'w' ) zf.writestr( 'testfilename', str( self._getOb( testfileid ) ) ) zf.close() f = open('/tmp3.zip') return f.read()
Try with zipefile.ZipFile(response,"a"), this should avoid the use of tell (untestet) otoh, If you'd use the tempfile module and dont return f.read() but use FileStreamIterator with it, you even have a win performance-wise. HTH Tino
participants (3)
-
John Toews -
Tino Wildenhain -
Tres Seaver