【问题标题】:PHP: Problem using passthru to stream a zip on mac os x onlyPHP:仅在 mac os x 上使用 passthru 流式传输 zip 的问题
【发布时间】: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 的任何通知。

标签: php macos zip passthru


【解决方案1】:

如果您使用的是 nginx,请查看http://wiki.nginx.org/NginxNgxZip

【讨论】:

  • 非常好,我真的很喜欢这个。我目前正在使用 Apache2,但肯定会尝试一下。我还需要确保它不会将 zip 存储在磁盘上,因为我需要通过将文件动态添加到 zip 而不像许多其他 zipOnTheFlyScripts 那样将整个文件存储在服务器上来立即流式传输它的东西。我会让你知道事情的进展!谢谢
  • 这里 (stackoverflow.com/a/4357904/416630) 是一个适用于 apache 的解决方案(也应该适用于任何其他 Web 服务器)
猜你喜欢
  • 2010-12-24
  • 2016-10-07
  • 1970-01-01
  • 2012-08-15
  • 2016-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 2011-03-05
相关资源
最近更新 更多