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

Python 函数创建内存中的zip文件并作为http响应返回,python,zip,stringio,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) r

我避免在磁盘上创建文件,这是我迄今为止得到的:

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
你认为正确的优雅的蟒蛇够吗?有更好的方法吗


谢谢

避免使用磁盘文件可能会使服务器爬行速度变慢,但它肯定会起作用


如果同时处理过多的请求,将耗尽内存。

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

如果它正确或不正确,你可以说,因为只有你知道它应该做什么:)优雅是主观的,但它确实可以使用一些空白,并且可能从分解为多个功能中受益。另外,您可能需要确保文件在出现错误时关闭,您可以使用try finally或
with
-语句来完成。我想指出,一般来说,您不想压缩JPEG,因为它们已经被压缩了。@S.Lott,我很好奇,这里唯一担心的是耗尽内存吗?我认为避免将tmp文件写入磁盘会更快。谢谢。临时文件不一定要放在磁盘上(特别是在Linux上)。@Mark:你要测量才能知道。但是,一般来说,如果有足够的套接字带宽,web服务器会(1)绑定套接字I/O,然后(2)绑定内存。很少考虑磁盘I/O;客户端浏览器通常是最慢的东西;大型内存事务会占用大量内存,等待客户端浏览器完成接受流。错误的策略。@S.Lott好的,那么您认为最好创建一个zip文件,在其中添加'picture.zip',将生成的zip内容读入内存并删除临时zip文件,然后在HTTP响应中最终返回zip内容?@nabucosound:如果您在内存中有整个JPG或整个zip文件,你做得不对。首先,不要阅读整个JPEG,只需给ziplib命名即可。第二,不要阅读整个ZIP文件;一次只读取4K,并将字节“流”成小块。