gpt4 book ai didi

python - 在 Django 中使用 Python ZipStream 获取损坏的 zip

转载 作者:行者123 更新时间:2023-12-02 09:28:01 26 4
gpt4 key购买 nike

我对 Django 有点陌生,所以请耐心等待。
我正在使用 here 中的 zipstream并有一个 Django View ,该 View 返回所有文件附件的 zip 文件,这些附件全部托管在 Amazon S3 上。但是当我下载 zip 文件时,它们都已损坏,也就是说,我无法打开它们。我尝试使用 unzip -t 验证文件,但错误并没有多大帮助。

file_paths = [fa.file.url for fa in file_attachments.all()]

zf = zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED)

zip_subdir = "Attachments-%s" % (request_id)

for file_path in file_paths:
file_dir, file_name = os.path.split(file_path)

zf.writestr(file_name, urllib.urlopen(file_path).read())

zip_filename = "%s.zip" % (zip_subdir)

response = StreamingHttpResponse(zf, mimetype='application/zip')
response['Content-Disposition'] = \
'attachment; filename={}'.format(zip_filename)
return response

有什么想法吗?

解决了。

s = StringIO.StringIO()
with zipstream.ZipFile(s, mode='w', compression=zipstream.ZIP_DEFLATED) as zf:
#could fail on url open.
for file_path in file_paths:
file_dir, file_name = os.path.split(file_path)

try:
file_contents = urllib.urlopen(file_path).read()
zf.writestr(file_name, file_contents)
except IOError: #connection cannot be made
logging.error()

response = StreamingHttpResponse(s.getvalue(), mimetype='application/octet-stream')
response['Content-Disposition'] = \
'attachment; filename={}'.format("%s" % (request_id))
return response

最佳答案

完成写入后,您应该关闭ZipFile。否则,引用 documentation ,“除非您这样做,否则不会写入基本记录”。

最简洁的方法是使用 with 语句:

with zipstream.ZipFile(mode='w', compression=zipstream.ZIP_DEFLATED) as zf:
# ...write to zf...

关于python - 在 Django 中使用 Python ZipStream 获取损坏的 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26388324/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com