1

我想使用 7-Zip 压缩目录,然后将其下载到网络浏览器。

但是,不是压缩到文件,而是让 PHP 将该文件的内容提供给浏览器......我理想情况下希望让 7-Zip在创建存档时将新存档的内容写入标准输出。 .. 同时让 PHP 刷新其缓冲区并将数据发送到浏览器。

你看,我正在创建的档案非常大。从用户的角度来看,使用普通方法,当他们单击“下载”时,首先会创建存档并保存到一个文件中(这可能需要大约 10 分钟),然后才可以下载 PHP 厌倦的文件. 我想要做的是将归档和输出步骤合并到一个进程中。

有人对此有任何意见吗?

这是 SourceForge 上的其他人正在尝试做同样的事情......

http://sourceforge.net/projects/p7zip/forums/forum/383043/topic/3828566

=======

谢谢大家的帮助。我将关闭这个线程,因为我最近发现 StackOverflow 上已经存在关于这个主题的精彩讨论。看:

LAMP:如何即时为用户创建大文件的 .Zip,而不会出现磁盘/CPU 抖动

=======

这是我采用的最终解决方案,它对我来说非常有用。请注意,我使用的是“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");
4

3 回答 3

1

您可以尝试使用带有 -so(将数据写入标准输出)选项的 passthru 运行 7z。

只要您发送 7zip mime 类型的下载标头和内容类型标头,我相信它会起作用。

例子

<?php
$filename = "somefile.7z";
$contentType = "application/x-7z-compressed";
header("Content-type: ".$contentType); // tell the browser your sending a 7zip file
header("Content-Disposition: attachment; filename=\"".$filename."\""); // use 'attachment' to force a download
passthru('/path/to/7z a -so <fileOrDirToBe7Zipped>');
?>

希望有帮助!

于 2011-01-04T17:10:29.350 回答
1

这是我采用的最终解决方案,它对我来说非常有用。请注意,我使用的是“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");
于 2011-01-04T19:43:25.503 回答
-1

这要么是行不通的,要么是非常糟糕的。网络并不是这样工作的——许多浏览器将无法正确处理不完整的文件(这是他们将要得到的)。为什么不显示“正在生成您的文件!完成后我们将通过电子邮件将下载链接发送给您。” 消息,或“请稍候,我们正在生成您的文件。这可能需要几分钟。” 消息,以及进度表?

于 2011-01-04T16:52:55.950 回答