无法在iOS9中使用SSZipArchive解压一个大的zip文件(3.3GB)

13

正如标题所述,我使用Python的zipfile模块从我的Django后端服务器(托管在Ubuntu 14.04.1 LTS上)创建了zip文件:

zipfile.ZipFile(dest_path, mode='w', compression=zipfile.ZIP_DEFLATED, 
                allowZip64=True)

我成功地在我的Mac电脑上使用Finder打开了它,但是使用SSZipArchive库没有成功。我已经尝试过使用主分支的最新提交以及标记v1.0.1和v0.4.0。

使用v0.4.0时,在unzip.c的第1506行出现错误:

    if (unz64local_CheckCurrentFileCoherencyHeader(s,
                                                   &iSizeVar, 
                                                   &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
        return UNZ_BADZIPFILE;

每次都在同一文件上解压缩,并卡在同一个currentFileNumber上。

有人得到任何提示吗?

附言:我认为SSZipArchive应该支持Zip64存档文件,因为我在他们的github repo上提出了一个问题

更新 [20160129] 我对zip文件进行了zipinfo检查,并获得了以下输出:

...
-rw-r--r--  2.0 unx     1992 b- defN 26-Nov-15 14:59 <file_name>
-rw-r--r--  2.0 unx      925 b- defN 26-Nov-15 14:59 <file_name>
-rw-r--r--  2.0 unx     1194 b- defN 26-Nov-15 14:59 <file_name>
-rw-r--r--  2.0 unx       72 b- defN 26-Nov-15 14:52 <file_name>
-rw-r--r--  2.0 unx      289 b- defN 18-Jan-16 11:27 <file_name>
-rw-r--r--  2.0 unx     1541 b- defN 18-Jan-16 11:27 <file_name>
-rw-r--r--  2.0 unx      295 b- defN 18-Jan-16 11:27 <file_name>
-rw-r--r--  2.0 unx 449619181 b- defN 18-Jan-16 11:26 <file_name>
-rw-r--r--  4.5 unx 73128184 bx defN 18-Jan-16 11:26 <file_name>
-rw-r--r--  4.5 unx 69444488 bx defN 18-Jan-16 11:26 <file_name>
-rw-r--r--  4.5 unx   671440 bx defN 18-Jan-16 11:26 <file_name>
-rw-r--r--  4.5 unx 20189549 bx defN 18-Jan-16 11:27 <file_name>
-rw-r--r--  4.5 unx      197 bx defN 18-Jan-16 11:26 <file_name>
-rw-r--r--  4.5 unx  1379396 bx defN 18-Jan-16 11:26 <file_name>
...

1
看起来文件大小在zip归档的头部中被错误地报告了。还有一些依赖于minizip的其他工具,特别是针对JSON文件报告了这种类型的行为,尽管它们似乎是相当旧的问题。您是否知道导致此问题的文件类型,并且可以使用另一个zip工具将其删除以帮助缩小行为范围? - A Small Shell Script
我发现导致问题的文件是一个大的mp4视频文件。但我不知道这个大的mp4视频是否是罪魁祸首。你可以看到上面大小为449619181的2.0行是这个大的mp4文件。 - chubao
你是否在MP4文件上有注释?http://stackoverflow.com/questions/20250022/why-minizip-doesnt-archive-large-file-larger-4-gb - A Small Shell Script
@ASmallShellScript 我该如何检查文件是否具有文件注释? - chubao
我认为这样做可能会起作用。由于文件很大,您可能可以以更好的方式查找所需的文件。 zf = zipfile.ZipFile(archive_name) for info in zf.infolist(): info.comment - A Small Shell Script
2个回答

2
经过多次尝试,我发现问题出在Python的zipfile包生成的zip文件上。如果我使用Ubuntu服务器版本提供的zip命令压缩4GB的大数据,SSZipArchive可以成功解压缩。我使用zipinfo测试了zip文件,并发现:
...
-rw-r--r--  3.0 unx     2939 bx     2677 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx    15069 bx     3040 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     3265 bx     3003 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     3048 bx     2766 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     3453 bx     3168 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     1415 tx      534 defN 16-Jan-28 16:33 <file_name>
drwxr-xr-x  3.0 unx        0 bx        0 stor 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     3302 tx      695 defN 16-Jan-28 16:33 <file_name>
drwxr-xr-x  3.0 unx        0 bx        0 stor 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx   130678 bx   127322 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx   133540 bx   130045 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx      136 tx       71 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     1416 tx      541 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     1417 tx      541 defN 16-Jan-28 16:33 <file_name>
-rw-r--r--  3.0 unx     2766 tx      652 defN 16-Jan-28 16:33 <file_name>
5551 files, 3854751563 bytes uncompressed, 3793408959 bytes compressed:  1.6%

0
总结一下之前提到但没有强调的问题:该问题是由ZIP头版本字段引起的-在存档中,每个文件的头部都重复了这个字段。默认的Linux zip命令(Info-ZIP)使用头部版本3.0,如上面的答案所示。Python默认使用头部2.0。但是,如果某个文件超过了2GB的大小阈值,则Python会切换到4.5头部版本,以处理此文件和随后的文件。看来这会导致SSZipArchive出现问题。 目前我的临时解决办法是对zipfile模块进行猴子补丁。
import zipfile
zipfile.ZIP64_VERSION = 30  # instead of 45

这将创建可被SSZipArchive读取的zip归档文件,但我认为它也会违反Zip64标准,该标准规定对于Zip64格式的归档文件,此值不应小于45(对于extract_version字段)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接