用于创建内存中zip文件并作为http响应返回的函数

时间:2010-03-09 18:28:16

标签: python zip stringio

我避免在磁盘上创建文件,这是我到目前为止所做的:

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

你认为正确 - 优雅 - pythonic足够吗?有没有更好的方法呢?

谢谢!

2 个答案:

答案 0 :(得分:12)

对于StringIO,您通常应使用o.getvalue()来获取结果。此外,如果要将普通文件添加到zip文件,可以使用zf.write('picture.jpg')。您无需手动阅读它。

答案 1 :(得分:4)

避免使用磁盘文件可能会使服务器变慢,但它肯定会有效。

如果你同时提供太多这些请求,你就会耗尽内存。