Python / Django:提供一个zip文件,可从io.BytesIO buffer

时间:2018-01-28 16:40:23

标签: python django

我试图将一个zip文件放入io.BytesIO缓冲区,然后提供下载。以下是我所得到的(较长的views.py的一部分,我只是发布了相关部分)。

但是我收到以下错误消息:

AttributeError at 'bytes' object has no attribute 'read'

谁能告诉我我做错了什么?

from django.http import HttpResponse
from wsgiref.util import FileWrapper
from zipfile import *
import io

buffer = io.BytesIO()

zipf = ZipFile(buffer, "w")
zipf.write ("file.txt")
zipf.close()

response = HttpResponse(FileWrapper(buffer.getvalue()), content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=file.zip'

return response

编辑: 它告诉我错误来自这条线:

response = HttpResponse(FileWrapper(buffer.getvalue()), content_type='application/zip')

3 个答案:

答案 0 :(得分:2)

您需要以字节模式('b')

读取文件

尝试更改

buffer = io.BytesIO()
zipf = ZipFile(buffer, "w")
zipf.write ("file.txt")
zipf.close()

zipf = zipfile.ZipFile("hello.zip", "w")
zipf.write("file.txt")
zipf.close()
response = HttpResponse(io.open("hello.zip", mode="rb").read(), content_type='application/zip')

答案 1 :(得分:0)

我没有将文件存储在内存中然后以zip格式发送,而是将文件保存到服务器上,然后按照this example发送。

答案 2 :(得分:0)

我知道这个线程有点旧,但是仍然。

BytesIO对象的getvalue()方法返回以字节为单位的内容,该内容可以通过HttpResponse传递到content_type='application/zip'

buffer = io.BytesIO()
zipf = ZipFile(buffer, "w")
zipf.write ("file.txt")
zipf.close()
response = HttpResponse(buffer.getvalue(), content_type='application/zip')
response['Content-Disposition'] = 'attachment; filename=file.zip'
return response