问题
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!
回答1:
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.
回答2:
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.
来源:https://stackoverflow.com/questions/2411514/function-to-create-in-memory-zip-file-and-return-as-http-response