Zip Stream в PHP - PullRequest
       75

Zip Stream в PHP

17 голосов
/ 20 июня 2010

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

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

Ответы [ 5 ]

13 голосов
/ 22 июня 2013

Если ваш веб-сервер работает под управлением linux, вы МОЖЕТЕ сделать это в потоковом режиме без создания временного файла.Под win32 вам может понадобиться использовать Cygwin или что-то подобное.

Если вы используете «-» в качестве имени файла zip, оно будет сжато в стандартный вывод.Оттуда достаточно просто перенаправить этот поток с помощью 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 );
     }
?>
10 голосов
/ 22 ноября 2011

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

5 голосов
/ 20 июня 2010

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

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

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

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

0 голосов
/ 20 июня 2010

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

...