在我的 django 项目中,我需要将一个 zip 文件发送到客户端进行下载。这个 zip 文件将包含从各种 url 下载的图像。
是否可以在不将图像文件写入磁盘的情况下将图像下载到内存中,然后将它们添加到内存本身的 zip 文件中,再次不将 zip 文件写入磁盘,最后将 zip 文件发送到客户端进行下载?
我知道 urllib2 可用于图像下载,而 zipfile 可用于处理 zip 文件,但在内存本身中执行这些操作时遇到问题。因此,非常感谢您提供一些示例。
谢谢你
使用 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
您可以这样做,只需:
response = urllib2.urlopen('http://..')
img_bytes = response.read()
然后使用 ZipFile.writestr 将这些字节写入文件,在您之前创建的 Zip 中传递一个 StringIO 处理程序而不是真正的文件处理程序。完成写入文件后,将其作为 HTTPResponse 返回,设置正确的 mimetype 和内容处置。
但我不会为此使用 RAM。为什么不使用 tempfile.NamedTemporaryFile?