Zip Stream в PHP
У меня есть PHP script, который создает zip файл на лету и заставляет браузер загружать zip файл. Возникает вопрос: могу ли я напрямую написать zip файл в поток вывода, который подключен к пользовательскому браузеру, а не сначала сохранить его как реальный файл на сервере, а затем отправить файл?
Спасибо заранее.
Ответы
Ответ 1
Если ваш веб-сервер работает под управлением 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 );
}
?>
Ответ 2
Эта библиотека, похоже, является тем, что вы ищете:
https://github.com/maennchen/ZipStream-PHP
Ответ 3
Если вы используете расширение zip, ответ кажется "нет" . Метод close в классе ZipArchive является тем, что запускает запись, и, похоже, он хочет записать в файл. Возможно, вам повезло с помощью Streams для имитации файла, но затем вы сохраняете всю вещь в памяти, и вы все еще не можете отправьте его, пока вы не добавите файлы.
Если у вас возникли проблемы с тайм-аутами или другими проблемами, когда пользователь ждет создания zip файла, попробуйте выполнить многоэтапный процесс загрузки:
- Пользователь выбирает все, что они выбирают, чтобы создать zip
- Они переходят на страницу состояния, которая использует вызовы ajax для фактического создания zip файла в фоновом режиме. Симпатичная, отвлекающая анимация должна держать свое внимание.
- После того, как фоновые процессы создают zip, пользователь перенаправляется на script, который выполняет загрузку/перенаправление на файл.
Ответ 4
Да, вы можете напрямую передать zip клиенту с помощью этого git rep: Крупные файлы Zip Stream
Ответ 5
Нет, вам нужно использовать временный файл, как в здесь.