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

6 投票
2 回答
6958 浏览
提问于 2025-04-15 20:13

我在尽量避免在硬盘上创建文件,这是我目前的做法:

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

你觉得这样做正确吗?够优雅、符合Python的风格吗?有没有更好的方法呢?

谢谢!

2 个回答

4

如果不使用磁盘文件,你的服务器可能会变得非常慢,但这样做肯定是可行的。

如果同时处理太多这样的请求,你的内存会被用光。

12

对于 StringIO,一般来说,你应该使用 o.getvalue() 来获取结果。另外,如果你想把一个普通文件添加到压缩文件中,可以用 zf.write('picture.jpg')。你不需要手动去读取这个文件。

撰写回答