Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从内存中的url下载图像并在内存中创建zip存档以发送到浏览器_Python_Django_Zip - Fatal编程技术网

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

Python 从内存中的url下载图像并在内存中创建zip存档以发送到浏览器,python,django,zip,Python,Django,Zip,在我的django项目中,我需要发送一个zip文件到客户端下载。这个zip文件将包含从各种url下载的图像 是否可以在不将图像文件写入磁盘的情况下将图像下载到内存中,然后将其添加到内存中的zip文件中,再次不将zip文件写入磁盘,最后将zip文件发送到客户端进行下载 我知道urllib2可用于图像下载,zipfile可用于处理zip文件,但在内存中执行这些操作时会遇到问题。因此,请举一些例子 谢谢下载带有urllib2的文件。打开一个新的ZipFile进行写入(需要一个StringIO对象)。将

在我的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和内容处理


但我不会用公羊来做这个。为什么不使用tempfile.NamedTemporaryFile?

我想不出任何好的理由把它写到磁盘上,除非他正在压缩大量的图像,即使这样,我也不确定这会有多大帮助。您所做的只是添加不必要的磁盘io(这很可能是web服务器上的限制因素),这取决于下载操作的用户并发性。如果他在飞行中从各个链接抓取照片,这可能需要一些时间才能清除内存。从Django文档:默认情况下,如果上载的文件小于2.5 MB,Django将在内存中保存上载的全部内容。我想这取决于使用的大小和并发性。谢谢你的回复。但是在客户端,我没有收到“文件另存为”对话框。我在chrome浏览器中尝试了此操作。服务器会给你什么响应?我在chrome调试器中进行了检查,在响应窗格中显示了一些乱码字符。响应头是连接:保持活动内容处置:附件;filename=foobar.zip内容类型:application/zip日期:Thu,2012年4月19日21:19:18 GMT P3p:CP=“IDC CURa ADMa我们的IND PHY ONL COM STA”服务器:gunicorn/0.14.2传输编码:chunkedIm真的很抱歉,我是通过ajax发出请求的,我的错误:)。它起作用了。非常感谢你的帮助!!:)我尝试这个时出错了。可能是因为我是从s3读的,所以我得到了url,用urllib2打开它。但当我尝试使用writestr()时,我得到了“TypeError:unicode参数预期为'str'”