Python Ptyhon将zip文件转换为字节流

Python Ptyhon将zip文件转换为字节流,python,io,zipfile,Python,Io,Zipfile,我有一个zip文件,当我在本地打开它时,它看起来很棒。我想将其转换为字节流缓冲区,然后使用django将其作为HttpResponse(缓冲区)返回。代码是 studies_zip = zipfile.ZipFile('./studies.zip', 'r') buffer = io.BytesIO() bytes = [zipfile.Path(studies_zip, at=file.filename).read_bytes() for file in studi

我有一个zip文件,当我在本地打开它时,它看起来很棒。我想将其转换为字节流
缓冲区
,然后使用
django
将其作为
HttpResponse(缓冲区)
返回。代码是

studies_zip = zipfile.ZipFile('./studies.zip', 'r')
buffer = io.BytesIO()
bytes = [zipfile.Path(studies_zip, at=file.filename).read_bytes() 
             for file in studies_zip.infolist()]

buffer = io.BytesIO()
buffer_writer = io.BufferedWriter(buffer)
[buffer_writer.write(b) for b in bytes]
buffer.seek(0)

response = HttpResponse(buffer)
response['Content-Type'] = 'application/zip'
response['Content-Disposition'] = 'attachment;filename=studies.zip'
在前端/UI中,我得到了这个

这看起来不错,即
34.9MB
的显示大小略小于实际
36.6MB
。此外,当我试图当场打开文件或在本地保存文件后打开文件时,我会


怎么了?

您发送的是压缩文件的内容,而忽略了zip存档中包含的元数据

没有理由以zip文件的形式打开文件,因为没有对内容进行任何更改,所以只需以“是”模式打开文件并发送即可。我还没有测试过这个,但是试试这个:

with open('./studies.zip', 'rb') as f:
    response = HttpResponse(f)
    response['Content-Type'] = 'application/zip'
    response['Content-Disposition'] = 'attachment;filename=studies.zip'

您正在发送压缩文件的内容,而忽略了zip存档中包含的元数据

没有理由以zip文件的形式打开文件,因为没有对内容进行任何更改,所以只需以“是”模式打开文件并发送即可。我还没有测试过这个,但是试试这个:

with open('./studies.zip', 'rb') as f:
    response = HttpResponse(f)
    response['Content-Type'] = 'application/zip'
    response['Content-Disposition'] = 'attachment;filename=studies.zip'

作为旁白,请不要使用列表理解来产生副作用:
[buffer\u writer.write(b)for b in bytes]
作为旁白,请不要使用列表理解来产生副作用:
[buffer\u writer.write(b)for b in bytes]
它工作起来很有魅力。谢谢。它很有魅力。谢谢