Zip Stream в PHP

У меня есть PHP-скрипт, который создает zip-файл «на лету» и заставляет браузер загружать zip-файл. Возникает вопрос: могу ли я напрямую написать zip-файл в поток вывода, который подключен к браузеру пользователя, а не сначала сохранять его в качестве реального файла на сервере, а затем отправить файл?

Заранее спасибо.

Если ваш веб-сервер работает под управлением Linux, вы можете его выполнять без потокового файла. В win32 вам может понадобиться использовать Cygwin или что-то подобное.

Если вы используете «-» в качестве имени zip-файла, он будет сжиматься до stdout. Оттуда достаточно просто перенаправить этот поток, используя popen (). Аргумент «-q» просто указывает zip не выводить текст состояния, который он обычно будет. Для получения дополнительной информации см. Справочную страницу zip (1).

<? $zipfilename = "zip_file_name.zip"; if( isset( $files ) ) unset( $files ); $target = "/some/directory/of/files/you/want/to/zip"; $d = dir( $target ); while( false !== ( $entry = $d->read() ) ) { if( substr( $entry, 0, 1 ) != "." && !is_dir( $entry ) ) { $files[] = $entry; } } header( "Content-Type: application/x-zip" ); header( "Content-Disposition: attachment; filename=\"$zipfilename\"" ); $filespec = ""; foreach( $files as $entry ) { $filespec .= "\"$entry\" "; } chdir( $target ); $stream = popen( "/usr/bin/zip -q - $filespec", "r" ); if( $stream ) { fpassthru( $stream ); fclose( $stream ); } ?> 

Эта библиотека, похоже, является тем, что вы ищете: https://github.com/maennchen/ZipStream-PHP

Если вы используете расширение zip , ответ кажется «нет». Метод close в классе ZipArchive – это то, что запускает запись, и, похоже, он хочет записать в файл. Возможно, вам удастся использовать Streams для имитации файла, но тогда вы сохраняете всю вещь в памяти, и вы все равно не можете отправить ее, пока не закончите добавлять файлы.

Если у вас возникли проблемы с тайм-аутами или другими проблемами, когда пользователь ждет создания zip-файла, попробуйте выполнить многоэтапный процесс загрузки:

  1. Пользователь выбирает все, что они выбирают, чтобы создать почтовый индекс.
  2. Они переходят на страницу статуса, которая использует вызовы ajax для фактического создания zip-файла в фоновом режиме. Симпатичная, отвлекающая анимация должна держать свое внимание.
  3. После того как фоновые процессы создают zip, пользователь перенаправляется на скрипт, который выполняет загрузку / перенаправление на файл.

Да, вы можете напрямую передать zip клиенту, используя этот git rep: Zip Stream Large Files

Нет, вам нужно использовать временный файл, как здесь .