我正在尝试通过使用Unix的zip命令和PHP的passthru函数来组合一个zip流式传输解决方案,但我遇到了麻烦。
脚本看起来像这样:
<?php
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachement; filename=myfile.zip");
passthru("zip -r -0 - /stuff/to/zip/");
exit();
?>
zip命令工作正常,浏览器收到输出并保存为zip文件。 然后可以在Windows和Unix上提取zip,但在Mac OS X上,内置提取器(BOMArchiveHelper)无法提取文件。在OS X上使用其他应用程序可以正常工作。
如果zip受密码保护(不由应用程序处理),BOMArchiveHelper给出的错误与它给出的错误相同。我使用了某种类型的zip分析器程序,它表明zip存档中的一些文件被标记为受密码保护。 就像我说的那样,没有其他提取应用程序显然会注意到这一点。
当拉近拉链时,我发现PHP文件生成的文件比服务器上的zip命令直接生成的文件大几个字节。 似乎带有passthru的流进程会在文件中添加一些可能导致BOMArchiveHelper出现问题的内容。
为了测试这个,我使用passthru来流式传输我已在服务器上创建的zip:passthru(“cat stuff.zip”) 这对BOMArchiveHelper工作得很好。
所以这个问题似乎存在于passthru函数获取zip命令即时生成的二进制数据并将其传递给浏览器的过程中。
我试图消除可以生成额外字节的所有源(将zip命令设置为quiet等),但添加的数据仍然存在。 流式压缩文件的二进制差异和预生成的zip表示额外的数据分散在整个zip中,而不仅仅是在结尾或开头。
任何人都有线索,或者之前看过这个问题并决定不可能解决?
注意:由于其他人已经遇到并在我面前很好地描述了这个问题而没有任何答案我只是在这里复制/粘贴他的信息,并确保他的所有测试都有效地失败了,我的任何一个都没有通过... < / p>
显然,让这个工作的唯一方法是让人们使用unzip或suffitexpander ......