PHP中的Zip流

17 php zip stream

我有一个PHP脚本,可以动态创建一个zip文件并强制浏览器下载zip文件.问题是:我可以直接将zip文件写入连接到用户浏览器的输出流,而不是先将其保存为服务器上的真实文件然后发送文件吗?

提前致谢.

小智 13

如果您的Web服务器正在运行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 );
     }
?>
Run Code Online (Sandbox Code Playgroud)


And*_*ohr 10

这个库似乎是你正在寻找的:https: //github.com/maennchen/ZipStream-PHP


Cha*_*les 5

如果您使用的是zip扩展名,答案似乎是"不".ZipArchive类中close方法是触发写入的方法,它似乎想要写入文件.你可能有幸使用Streams来模拟文件,但是你将整个内容保存在内存中,在完成添加文件之前你仍然无法发送它.

如果您在用户等待创建zip文件时遇到超时或其他问题,请尝试多步下载过程:

  1. 用户选择他们选择的任何内容来创建zip
  2. 他们被带到一个状态页面,该页面使用ajax调用实际在后台构建zip文件.一个漂亮,令人分心的动画应该引起他们的注意.
  3. 后台进程构建zip后,用户将被重定向到执行下载/重定向到文件的脚本.