从内存中的url下载图像并在内存中创建zip存档以发送到浏览器

时间:2012-04-19 19:47:22

标签: python django zip

在我的django项目中,我需要将一个zip文件发送到客户端进行下载。这个zip文件将包含从各个URL下载的图像。

是否可以在不将图像文件写入磁盘的情况下将图像下载到内存中,然后将它们添加到内存中的zip文件中,再次将zip文件写入磁盘并最终将zip文件发送到客户端进行下载?

我知道urllib2可以用于图像下载和zipfile来处理zip文件,但是在内存中执行这些操作时遇到了问题。所以,我们非常感谢你的一些例子。

谢谢

2 个答案:

答案 0 :(得分:3)

使用urllib2下载文件。打开一个新的ZipFile进行写入(你需要一个StringIO对象)。将url的输出写入ZilpFile.writestr。将zip文件附加到django响应。

import urllib2
from StringIO import StringIO

url = urllib2.urlopen('http://example.com/foo.jpg')
f = StringIO()
zip = zipfile.ZipFile(f, 'w')
zip.writestr('foo.jpg', url.read())
response = HttpResponse(f.getvalue(), content_type="application/zip")
response['Content-Disposition'] = 'attachment; filename=foobar.zip'
return response

答案 1 :(得分:0)

你可以这样做,只需:

response = urllib2.urlopen('http://..')
img_bytes = response.read()

然后使用ZipFile.writestr将这些字节写入一个文件,在你之前创建的Zip中传递一个StringIO处理程序而不是一个真正的文件处理程序。完成文件写入后,将其作为HTTPResponse设置正确的mimetype和内容处理。

但我不会为此使用RAM。为什么不使用tempfile.NamedTemporaryFile?