Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用zipfile.ZIP_压缩方法提取用Python创建的ZIP文件_Java_Python_Zip - Fatal编程技术网

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

Java 无法使用zipfile.ZIP_压缩方法提取用Python创建的ZIP文件,java,python,zip,Java,Python,Zip,我有两个程序(一个用Java,一个用Python),它们压缩文件夹,将其上传到Web服务器,并在上面触发解压方法 Java版本的程序工作正常,文件在服务器上提取时没有问题 这里我使用的是ArchiveStreamFactory类,即新的ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP,this.currentOutputStream) Python版本只有在我使用zipfile.ZIP\u存储的方法

我有两个程序(一个用Java,一个用Python),它们压缩文件夹,将其上传到Web服务器,并在上面触发解压方法

Java版本的程序工作正常,文件在服务器上提取时没有问题

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

Python版本只有在我使用
zipfile.ZIP\u存储的
方法(不压缩文件)时才有效。如果我使用
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生成的归档文件却不能工作呢?

因此,经过大量调试和反复试验,我发现了这个问题,以防其他人感兴趣或会遇到同样的问题

我还将文件夹添加到zip中,看起来它不喜欢用zip压缩文件夹。我所做的是手动将压缩设置为ZIP_存储用于文件夹,ZIP_压缩用于文件,然后它就工作了。有趣的是,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)

您是否尝试过使用标准工具解压缩档案以比较其内容?这将有助于显示在两个程序中进行压缩的实际代码。另外,学习独立测试代码的组件,并创建SSCCE。为了确定压缩是否正常工作,您不必担心web服务器。是的,使用标准工具(OSX unarchiver)可以工作。因此,这肯定是他们这边的事情(他们也运行Java),但只要用Java制作的存档有效,我想我还没有弄清楚Java是如何压缩文件的,而Python是如何压缩文件的。文件大小有很大的不同。183字节对15000字节。您确定要在这两个文件中压缩相同的内容吗?它是不同的文件(请参见名称)。忽略大小,我粘贴了它,因为我认为其他信息是相关的(压缩类型,文件系统),谢谢!我也有同样的问题!