网站上需要提供一些打印数据给用户下载,这些文件每次都需要重新生成,因为随时都会有新的数据产生。网络上关于PHP的压缩功能实现有多种方式,比如PclZip,ZipArchive等。PclZip是使用PHP写的一个压缩解压类,方便使用,不用安装扩展;而ZipArchive则在PHP 5.3之后随PHP携带发行,不需要再去开启扩展。本文则使用PHP自带的ZipArchive进行文档压缩。
由于还要提供给用户下载,这里参考了网络上下载类,以下为downlaod.class.php代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | <?php class download{ protected $_filename ; protected $_filepath ; protected $_filesize ; //文件大小 public function __construct( $filename ){ $this ->_filename= $filename ; $this ->_filepath=dirname( __FILE__ ). '/' . $filename ; } public function __destruct() { if ( file_exists ( $this ->_filepath)){ unlink( $this ->_filepath); } } //获取文件名 public function getfilename(){ return $this ->_filename; } //获取文件路径(包含文件名) public function getfilepath(){ return $this ->_filepath; } //获取文件大小 public function getfilesize(){ return $this ->_filesize=number_format( filesize ( $this ->_filepath)/(1024*1024),2); //去小数点后两位 } //下载文件的功能 public function getfiles(){ //检查文件是否存在 if ( file_exists ( $this ->_filepath)){ //打开文件 $file = fopen ( $this ->_filepath, "r" ); //返回的文件类型 Header( "Content-type: application/octet-stream" ); //按照字节大小返回 Header( "Accept-Ranges: bytes" ); //返回文件的大小 Header( "Accept-Length: " . filesize ( $this ->_filepath)); //这里对客户端的弹出对话框,对应的文件名 Header( "Content-Disposition: attachment; filename=" . $this ->_filename); //修改之前,一次性将数据传输给客户端 echo fread ( $file , filesize ( $this ->_filepath)); //修改之后,一次只传输1024个字节的数据给客户端 //向客户端回送数据 $buffer =1024; // //判断文件是否读完 while (! feof ( $file )) { //将文件读入内存 $file_data = fread ( $file , $buffer ); //每次向客户端回送1024个字节的数据 echo $file_data ; } fclose( $file ); } else { echo "<script>alert('对不起,您要下载的文件不存在');</script>" ; } } } |
ZipArchive有两个添加文件的方法addFile 和addFromString,addFile可将现有文件添加进去,而addFromStrin则可以添加一些动态的文本 。在要下载文件中则简单调用,代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php include 'download.class.php' ; $res = '' ; //动态结果 $zip = new ZipArchive(); $zipname = date ( 'YmdHis' ,time()). '.zip' ; //随机文件名 if (! file_exists ( $zipname )){ $zip ->open( $zipname ,ZipArchive::OVERWRITE); //创建一个空的zip文件 //$zip->addFile('/images/show.pic','show.pic');//将/images/show.pic文件添加进去 //$content=file_get_contents('http://127.0.0.1/data.php?r='$res); //if ( $content !== false ) { //$zip->addFromString('data.xml',$content);//使用字符串的方式动态添加 //} $zip ->addFromString( 'test.txt' , 'some text ...' ); $zip ->close(); $dw = new download( $zipname ); //下载文件 $dw ->getfiles(); unlink( $zipname ); //下载完成后要主动删除 } |
注意在windows平台下压缩的文件路径在linux可能识别不了。
参考链接:
PclZip:强大的PHP压缩与解压缩zip类
PHP ZipArchive 实现压缩解压Zip文件
文件打包,下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
php ZipArchive class