我有两个程序(一个在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生成的归档不起作用呢?
答案 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)