PHP 中的 Zip 流

2022-08-30 18:29:46

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

提前致谢。


答案 1

如果您的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 );
     }
?>

答案 2

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


推荐