我有两个程序(一个是 Java 的,一个是 Python 的),它们可以压缩一个文件夹,将其上传到 Web 服务器并触发它们的 UNZIP 方法。
该程序的 Java 版本可以正常运行,并且在服务器上提取文件也没有问题。
这里我使用 ArchiveStreamFactory 类,即 new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, this.currentOutputStream);
Python 版本仅在我使用 zipfile.ZIP_STORED 方法(不压缩文件)时才有效。如果我使用 zipfile.ZIP_DEFLATED 方法,我会收到内部服务器错误。
我无权访问服务器,因此我只能依靠我自己能弄清楚的内容。
Java 程序似乎也使用了 ZIP_DEFLATED 方法,因为存档被压缩(较小)而不仅仅是存储。
我还在这两个存档上运行了 zipinfo
(一个是用 Java 创建的,另一个是用 Python 和 DEFLATE 创建的 - 这不起作用),看看有什么不同。
这是输出:
# Java
-rw---- 2.0 fat 14398 bl defN 4-Jun-15 13:55 somefile.txt
# Python
-rw-r--r-- 2.0 unx 183 b- defN 28-Jun-15 21:39 someotherfile.txt
两者似乎都是用 DEFLATE (defN) 方法压缩的,那么为什么 Java 生成的存档可以工作,而 Python 生成的存档却不能呢?
最佳答案
因此,经过大量调试和反复试验后,我发现了这个问题,以防其他人感兴趣或遇到同样的问题。
我还将文件夹添加到 zip 中,看起来它不喜欢使用 ZIP_DEFLATED 压缩文件夹。我所做的是将文件夹的压缩手动设置为 ZIP_STORED,将文件的压缩设置为 ZIP_DEFLATED,之后它就起作用了。有趣的是,Java 如何知道在幕后自动执行此操作,或者至少我猜它是这样做的,因为 Java 版本是相同的(迭代文件夹/文件并将它们添加到 ZIP 中),除了我只使用默认值(所以我从未明确设置任何内容的压缩类型)。
所以基本上我的代码(不起作用的版本)是这样的:
for dir_path, dir_names, file_names in os.walk(absolute_folder_path, compression=zipfile.ZIP_DEFLATED):
...
# Add folder to ZIP
f_zip.write(absolute_dir_path, arcname=relative_dir_path)
for file_name in file_names:
...
# Add file to ZIP
f_zip.write(absolute_file_path, arcname=relative_file_path)
修复方法如下:
for dir_path, dir_names, file_names in os.walk(absolute_folder_path):
...
# Add folder to ZIP
f_zip.write(absolute_dir_path, arcname=relative_dir_path, compress_type=zipfile.ZIP_STORED)
for file_name in file_names:
...
# Add file to ZIP
f_zip.write(absolute_file_path, arcname=relative_file_path, compress_type=zipfile.ZIP_DEFLATED)
关于java - 无法使用 zipfile.ZIP_DEFLATED 压缩方法提取使用 Python 创建的 ZIP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31123940/