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

时间:2015-06-29 19:27:26

标签: java python zip

我有两个程序(一个在Java中,一个在Python中),它们压缩文件夹,将其上传到WebServer并在它们上触发UNZIP方法。

程序的Java版本没有问题,文件在服务器上提取没有问题。

这里我使用的是ArchiveStreamFactory类,即new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP, this.currentOutputStream);

只有使用zipfile.ZIP_STORED方法(不压缩文件)时,Python版本才有效。如果我使用zipfile.ZIP_DEFLATED方法,我会收到内部服务器错误。

我无法访问服务器,所以我只能依靠我能够找到的东西。

Java程序似乎也使用ZIP_DEFLATED方法,因为存档被压缩(更小)而不仅仅是存储。

我还在两个档案上运行zipinfo(用Java创建的那个和带有DEFLATE的Python的那个 - 这不起作用)也看看有什么不同。

这是输出:

# 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生成的归档不起作用呢?

1 个答案:

答案 0 :(得分:1)

因此经过大量的调试和试错后,我发现了问题以防其他人感兴趣或者会遇到同样的问题。

我还将文件夹添加到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)