2

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

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

我知道 urllib2 可用于图像下载,而 zipfile 可用于处理 zip 文件,但在内存本身中执行这些操作时遇到问题。因此,非常感谢您提供一些示例。

谢谢你

4

2 回答 2

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
于 2012-04-19T19:53:48.590 回答
0

您可以这样做,只需:

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

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

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

于 2012-04-19T19:54:11.487 回答