PHP:仅在mac os x上使用passthru传输zip时出现问题

PHP:仅在mac os x上使用passthru传输zip时出现问题,php,macos,zip,passthru,Php,Macos,Zip,Passthru,我试图通过使用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命令

我试图通过使用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无法提取文件。不过,在OSX上使用其他应用程序也可以

BOMArchiveHelper给出的错误与应用程序未处理受密码保护的zip时给出的错误相同。我使用了某种zip分析器程序,它表明zip存档中的一些文件被标记为密码保护。 正如我所说,显然没有其他提取应用程序关注这一点

在检查zip closer时,我发现PHP文件生成的压缩比服务器上zip命令直接生成的压缩大几个字节。 似乎带有passthru的流进程向文件中添加了可能导致BOMArchiveHelper出现问题的内容

为了测试这一点,我使用passthru来传输我已经在服务器上创建的一个zip:passthrucat stuff.zip 这对BOMArchiveHelper很有效

因此,问题似乎存在于passthru函数获取zip命令动态生成的二进制数据并将其传递给浏览器的过程中

我试图消除所有可能生成额外字节的源,将zip命令设置为静默等等,但添加的数据仍然保留。 流式压缩和预生成压缩的二进制差异表明,额外的数据分散在整个压缩中,而不仅仅是在结尾或开头

有人有线索,或者以前见过这个问题,认为它不可能解决吗

注:由于其他人已经遇到并在我面前很好地描述了这个问题,没有任何答案,我只是将他的消息复制/粘贴到这里,并确保他的所有测试都有效地失败了,我的任何测试都没有通过


显然,唯一的办法是让人们使用解压或后缀扩展…

如果你使用的是nginx,那么看看你在标题中拼错了附件,但看起来你的问题是zip命令而不是PHP。我不确定这是否是由于zip命令造成的。。。因为当我在passthru函数外运行命令时,它会呈现一个我可以用mac打开的zip文件…很抱歉,我之前没有回复,但我没有收到stackoverflow的任何通知。非常好,我真的很喜欢这个。我目前正在使用Apache2,但肯定会尝试一下。我还需要确保它不会将zip存储在磁盘上,因为我需要一些东西,通过动态地将文件添加到zip中,而不会像许多其他Ziponthefly脚本那样将整个文件存储在服务器上,从而立即对其进行流式处理。我会让你知道事情的进展!这里有一个可以与apache一起使用的解决方案,也可以与任何其他web服务器一起使用