【发布时间】:2010-08-23 12:16:18
【问题描述】:
我正在尝试通过使用 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 上使用其他应用程序效果很好。
BOMArchiveHelper 给出的错误与 zip 受密码保护(不由应用程序处理)时给出的错误相同。我使用了某种 zip 分析程序,它表明 zip 存档中的某些文件被标记为受密码保护。 就像我说的那样,显然没有其他提取应用程序关注这一点。
在仔细检查 zip 时,我发现 PHP 文件生成的文件比服务器上的 zip 命令直接生成的文件大几个字节。 似乎带有 passthru 的流处理向文件中添加了一些可能导致 BOMArchiveHelper 出现问题的内容。
为了测试这一点,我使用 passthru 流式传输我已经在服务器上创建的 zip: passthru("cat stuff.zip") 这与 BOMArchiveHelper 配合得很好。
所以问题似乎在于 passthru 函数获取 zip 命令动态生成的二进制数据并将其传递给浏览器的过程中的某个地方。
我已尝试消除所有可能生成额外字节的来源(将 zip 命令设置为 quiet 等),但添加的数据仍然存在。 流式 zip 和预先生成的 zip 的二进制差异表明,额外的数据分散在整个 zip 中,而不仅仅是在结尾或开头。
任何人都有线索,或者以前看到过这个问题并决定无法解决?
注意:由于其他人已经在我面前遇到并很好地描述了这个问题而没有任何答案,我只是在这里复制/粘贴他的信息,并确保他的所有测试都确实失败了,我的任何一个都没有通过......
显然,让它工作的唯一方法是要求人们使用 unzip 或 suffitexpander ...
【问题讨论】:
-
您在标题中拼写错误的“附件”,但看起来您的问题是 zip 命令而不是 PHP。
-
我不确定这是由于 zip 命令造成的......因为当我在 passthru 函数之外运行命令时,它会呈现一个我可以用我的 mac 打开的 zip 文件。 ..
-
对不起,我没有早点回复,但我没有收到来自 stackoverflow 的任何通知。