PHP中的Zip流 [英] Zip Stream in PHP

查看:61
本文介绍了PHP中的Zip流的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a PHP script that creates a zip file on the fly and forces the browser to download the zip file. The question is: could I directly write the zip file to an output stream which is connected to the user's browser rather than save it as a real file on the server first and then send the file?

谢谢.

推荐答案

如果您的Web服务器运行的是Linux,则可以在不生成临时文件的情况下进行流式传输.在win32下,您可能需要使用Cygwin或类似的工具.

If your web server is running linux, then you CAN do it streaming without a temp file being generated. Under win32 you may need to use Cygwin or something similar.

如果使用-"作为zip文件名,它将压缩为stdout.从那里,使用popen()重定向流很容易. "-q"参数只是告诉zip不输出通常会输出的状态文本.有关更多信息,请参见zip(1)联机帮助页.

If you use "-" as the zip file name, it will compress to stdout. From there, it's easy enough to redirect that stream using popen(). The "-q" argument simply tells zip to not output the status text it normally would. See the zip(1) manpage for more info.

<?
     $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 );
     }
?>

这篇关于PHP中的Zip流的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆