Function to create in-memory zip file and return as http response

馋奶兔 提交于 2019-12-17 16:29:18

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!