java - 无法使用 zipfile.ZIP_DEFLATED 压缩方法提取使用 Python 创建的 ZIP 文件

标签 java python zip

我有两个程序(一个是 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/

相关文章:

python - matplotlib 一次只绘制一个图

支持 JS 的 Python 浏览器模拟器

java - JVM 在 ZipFile.getNextEntry() 处崩溃 - POI 的 BigGridDemo 的一部分

c# - 不包含文件夹的 Zip 文件

java - 替换 ":"之后的文本

java - 如何在 Android 中从 DialogFragment 获取数据到 MainActivity?

Python 可继承函数

java - 到达分支中顶点的第 n 个后继

java - 使用Jsoup提取表数据

javascript - 使用 jszip 将 mp3 添加到 zip 中