I am avoiding the creation of files on disk, this is what I have got so far:
def get_zip(request):
import zipfile, StringIO
i = open('picture.jpg', 'rb').read()
o = StringIO.StringIO()
zf = zipfile.ZipFile(o, mode='w')
zf.writestr('picture.jpg', i)
zf.close()
o.seek(0)
response = HttpResponse(o.read())
o.close()
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = "attachment; filename=\"picture.zip\""
return response
Do you think is correct-elegant-pythonic enough? Any better way to do it?
Thanks!
For StringIO
you should generally use o.getvalue()
to get the result. Also, if you want to add a normal file to the zip file, you can use zf.write('picture.jpg')
. You don't need to manually read it.
Avoiding disk files can slow your server to a crawl, but it will certainly work.
You'll exhaust memory if you serve too many of these requests concurrently.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With