PHP中的压缩流

Posted

技术标签:

【中文标题】PHP中的压缩流【英文标题】:Zip Stream in PHP 【发布时间】:2011-03-05 22:19:24 【问题描述】:

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

提前致谢。

【问题讨论】:

这个问题的答案在这里:***.com/a/4357904/416630 【参考方案1】:

如果您的 Web 服务器运行的是 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 );
     
?>

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

如果您使用的是zip extension,答案似乎是“否”。 close method in the ZipArchive class 是触发写入的原因,它似乎想要写入文件。您可能使用Streams 来模拟文件有一些运气,但是您将整个内容保存在内存中,并且在完成添加文件之前您仍然无法发送它。

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

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

【讨论】:

【参考方案4】:

是的,您可以使用以下 git rep 直接将 zip 流式传输到客户端:Zip Stream Large Files

【讨论】:

【参考方案5】:

不,您必须使用临时文件,如here。

【讨论】:

以上是关于PHP中的压缩流的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中从 /Filter /FlateDecode PDF 流中提取数据

请问微软.net自带压缩功能是在啥地方啊

PHP中的压缩流

PHP中的压缩流

如何[递归地]压缩PHP中的目录? [复制]

PHP 压缩gzip中的Javascript或CSS文件