python - Winzip 无法在 Windows 上打开由 python shutdown.make_archive 创建的存档。在 ubuntu 上存档管理器运行良好

标签 python django zip shutil

我试图在 django http 响应中返回一个 zip 文件,代码类似于...

archive = shutil.make_archive('testfolder', 'zip', MEDIA_ROOT, 'testfolder')
response = HttpResponse(FileWrapper(open(archive)),
                           content_type=mimetypes.guess_type(archive)[0])
response['Content-Length'] = getsize(archive)
response['Content-Disposition'] = "attachment; filename=test %s.zip" % datetime.now()
return response

现在,当在 ubuntu 上执行此代码时,生成的下载文件可以毫无问题地打开,但在 Windows 上执行时,创建的文件不会在 winzip 中打开(给出错误“不支持的 Zip 格式”)。

我在这里缺少一些非常明显的东西吗? python 代码不应该是可移植的吗?

编辑:

感谢J.F. Sebastian对于他的评论...

创建存档时没有问题,它正在将其读回到请求中。所以,解决方案是将我的代码的第二行更改为,

response = HttpResponse(FileWrapper(open(archive)),
                           content_type=mimetypes.guess_type(archive)[0])

到,

response = HttpResponse(FileWrapper(open(archive, 'rb')),  # notice extra 'rb'
                           content_type=mimetypes.guess_type(archive)[0])

结账,my answer to this question了解更多详情...

最佳答案

您编写的代码应该可以正常工作。我刚刚从您的代码片段中运行以下行来生成 zip 文件,并且能够在 Linux 和 Windows 上提取。

archive = shutil.make_archive('testfolder', 'zip', MEDIA_ROOT, 'testfolder')

发生了一些有趣且具体的事情。我建议您检查以下内容:

  1. 使用仅包含该行的脚本在 Django 外部生成 zip 文件。然后尝试在 Windows 计算机上提取它。这将帮助您排除与 Django、Web 服务器或浏览器相关的任何问题
  2. 如果有效,请查看您压缩的文件夹中的具体内容。这些文件的名称中是否有任何有趣的字符,是否有奇怪的文件类型或超长的文件名。
  3. 在 Windows 和 Linux 中对 zip 文件运行 md5 校验和,以确保这两个文件逐字节相同。排除可能发生的任何文件损坏。

关于python - Winzip 无法在 Windows 上打开由 python shutdown.make_archive 创建的存档。在 ubuntu 上存档管理器运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12697431/

相关文章:

CSS : Failed to load resource in chrome

iphone - 创建 zip 文件时大量大文件造成泄漏

python - 如何在 Python 中将 float 格式化为最大固定宽度

python - imaplib SSL 连接在关闭后卡在 CLOSE_WAIT

python - 如何从具有动态列的数据框中获取值

python - Django 模板 - 是否有内置方法可以将当前日期作为 'date' 类型而不是 'str' 类型获取?

python - 用于访问播客文件的 Rhythmbox 插件看不到它们

python - 如何重定向到另一个应用程序中的 View 并仍然传递参数(Django)

c++ - Python 的 zip() 等价于 C 或 C++

swift - 如何使用 swift 4 for mac os 应用程序提取和创建 .zip 文件?