我试图将一个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')
答案 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