【发布时间】:2011-06-03 12:37:05
【问题描述】:
我想使用 7-Zip 压缩目录,然后将其下载到网络浏览器。
但是,不是压缩到一个文件,而是让 PHP 将该文件的内容提供给浏览器......理想情况下,我希望 7-Zip 将新存档的内容写入标准输出 as正在创建存档...同时让 PHP 刷新其缓冲区并将数据发送到浏览器。
你看,我正在创建的存档非常大。从用户的角度来看,使用普通方法,当他们单击“下载”时,首先会创建存档并保存到一个文件中(可能需要大约 10 分钟),然后才可以下载 PHP 厌倦的文件.我想要做的是将归档和输出步骤合并到一个进程中。
有人对此有意见吗?
这是 SourceForge 上正在尝试做同样事情的其他人...
http://sourceforge.net/projects/p7zip/forums/forum/383043/topic/3828566
=======
感谢大家的帮助。我将关闭这个线程,因为我最近发现 StackOverflow 上已经存在关于这个主题的精彩讨论。见:
LAMP: How to create .Zip of large files for the user on the fly, without disk/CPU thrashing
=======
这是我采用的最终解决方案,它对我来说非常有效。请注意,我使用的是“InfoZip”程序,您几乎可以在任何平台上找到它。
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename="file.zip"');
header('Content-Transfer-Encoding: binary');
header('Accept-Ranges: bytes');
passthru("zip -8 -q -r - ./some_directory | cat");
【问题讨论】:
-
尝试将存档设置为
dev/stdout? (假设是 linux) -
7za 可执行文件是否将压缩数据发送到它的标准输出?你需要先得到它。
-
执行以下操作:“7za a -lr -mx0 -so ./davedir/”会导致:“错误:我不会将压缩数据写入终端。”
-
那是因为您没有将结果传送到任何地方。不过,它有 -so 选项是有原因的。它足够聪明,不会把它吐出来并用垃圾填满你的屏幕。 php 中的 passthru 函数应该将标准输出从 7z 传输出去并允许它运行。值得一试。