Возможно ли подать стандартный 7-zip в PHP скрипт? - PullRequest
1 голос
/ 04 января 2011

Я хотел бы сжать каталог с помощью 7-Zip, а затем загрузить его в веб-браузер.

Однако, вместо того, чтобы сжимать в файл, а затем, чтобы PHP передавал содержимое этого файла в браузер ... В идеале я бы хотел, чтобы 7-Zip записывал содержимое нового архива в стандартный вывод как архив создается ... Одновременно PHP очищает свой буфер и отправляет данные в браузер.

Видите ли, архив, который я создаю, довольно большой. С точки зрения пользователя, используя обычный метод, когда они нажимают «Загрузить», архив сначала создается и сохраняется в файл (это может занять ~ 10 минут), и только затем файл загружается PHP для загрузки. , То, что я пытаюсь сделать, это объединить шаги архивирования и вывода в один процесс.

Кто-нибудь имеет какие-либо материалы по этому вопросу?

Вот еще кто-то из SourceForge, который пытается сделать то же самое ...

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

=======

Спасибо за помощь. Я собираюсь закрыть эту ветку, так как недавно обнаружил, что отличная дискуссия по этой теме уже существует в StackOverflow. См:

ЛАМПА: Как создать .Zip больших файлов для пользователя на лету, без перегрузки диска / процессора

=======

Это последнее решение, с которым я столкнулся, и оно работает для меня просто фантастически. Обратите внимание, что я использую программу «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");

Ответы [ 3 ]

1 голос
/ 04 января 2011

Вы можете попробовать запустить 7z, используя passthru с опцией -so (записать данные в стандартный вывод).

Пока вы отправляете заголовки загрузки и заголовки типов контента для типов MIME 7zip, я думаю, это будет работать.

Пример

<?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>');
?>

Надеюсь, это поможет!

1 голос
/ 04 января 2011

Это последнее решение, с которым я столкнулся, и оно работает для меня просто фантастически.Обратите внимание, что я использую программу «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");
0 голосов
/ 04 января 2011

Это либо не сработает, либо будет ужасно глючить. Сеть на самом деле не работает так - многие браузеры не смогут корректно работать с неполным файлом (что они и получат). Почему бы не отобразить «Ваш файл создается! Мы отправим вам ссылку для загрузки по окончании». или «Пожалуйста, подождите, мы создаем ваш файл. Это может занять несколько минут». сообщение вместе с индикатором прогресса?

...