Java 无法使用zipfile.ZIP_压缩方法提取用Python创建的ZIP文件
我有两个程序(一个用Java,一个用Python),它们压缩文件夹,将其上传到Web服务器,并在上面触发解压方法 Java版本的程序工作正常,文件在服务器上提取时没有问题 这里我使用的是ArchiveStreamFactory类,即新的ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP,this.currentOutputStream)代码> Python版本只有在我使用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存储的方法
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字节。您确定要在这两个文件中压缩相同的内容吗?它是不同的文件(请参见名称)。忽略大小,我粘贴了它,因为我认为其他信息是相关的(压缩类型,文件系统),谢谢!我也有同样的问题!