PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
本文实例讲述了PHP实现将多个文件压缩成zip格式并下载到本地的方法。分享给大家供大家参考,具体如下:
废话不多说,直接上代码
//这里需要注意该目录是否存在,并且有创建的权限 $zipname='path/test.zip' //这是要打包的文件地址数组 $files=array("mypath/test1.txt","mypath/test2.pdf"); $zip=newZipArchive(); $res=$zip->open($zipname,ZipArchive::CREATE); if($res===TRUE){ foreach($filesas$file){ //这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名 $new_filename=substr($file,strrpos($file,'/')+1); $zip->addFile($file,$new_filename); } } //关闭文件 $zip->close();
//这里是下载zip文件 header("Content-Type:application/zip"); header("Content-Transfer-Encoding:Binary"); header("Content-Length:".filesize($zipname)); header("Content-Disposition:attachment;filename=\"".basename($zipname)."\""); readfile($zipname); exit;
附:这里再为大家提供一个zip压缩类:
GetFileList($dir); } if((!empty($dir))&&(!is_array($dir))&&(file_exists($dir)))chdir($dir); elsechdir($curdir); if(count($filelist)>0) { foreach($filelistas$filename) { if(is_file($filename)) { $fd=fopen($filename,"r"); $content=fread($fd,filesize($filename)); fclose($fd); if(is_array($dir))$filename=basename($filename); $this->addFile($content,$filename); } } $out=$this->file(); chdir($curdir); $fp=fopen($zipfilename,"w"); fwrite($fp,$out,strlen($out)); fclose($fp); } return1; } elsereturn0; } functionGetFileList($dir) { if(file_exists($dir)) { $args=func_get_args(); $pref=$args[1]; $dh=opendir($dir); while($files=readdir($dh)) { if(($files!=".")&&($files!="..")) { if(is_dir($dir.$files)) { $curdir=getcwd(); chdir($dir.$files); $file=array_merge($file,$this->GetFileList("","$pref$files/")); chdir($curdir); } else$file[]=$pref.$files; } } closedir($dh); } return$file; } var$datasec=array(); var$ctrl_dir=array(); var$eof_ctrl_dir="x50x4bx05x06x00x00x00x00"; var$old_offset=0; /** *ConvertsanUnixtimestamptoafourbyteDOSdateandtimeformat(date *inhightwobytes,timeinlowtwobytesallowingmagnitudecomparison). * *@paramintegerthecurrentUnixtimestamp * *@returnintegerthecurrentdateinafourbyteDOSformat * *@accessprivate */ functionunix2DosTime($unixtime=0){ $timearray=($unixtime==0)?getdate():getdate($unixtime); if($timearray['year']<1980){ $timearray['year']=1980; $timearray['mon']=1; $timearray['mday']=1; $timearray['hours']=0; $timearray['minutes']=0; $timearray['seconds']=0; }//endif return(($timearray['year']-1980)<<25)|($timearray['mon']<<21)|($timearray['mday']<<16)| ($timearray['hours']<<11)|($timearray['minutes']<<5)|($timearray['seconds']>>1); }//endofthe'unix2DosTime()'method /** *Adds"file"toarchive * *@paramstringfilecontents *@paramstringnameofthefileinthearchive(maycontainsthepath) *@paramintegerthecurrenttimestamp * *@accesspublic */ functionaddFile($data,$name,$time=0) { $name=str_replace('','/',$name); $dtime=dechex($this->unix2DosTime($time)); $hexdtime='x'.$dtime[6].$dtime[7] .'x'.$dtime[4].$dtime[5] .'x'.$dtime[2].$dtime[3] .'x'.$dtime[0].$dtime[1]; eval('$hexdtime="'.$hexdtime.'";'); $fr="x50x4bx03x04"; $fr.="x14x00";//verneededtoextract $fr.="x00x00";//genpurposebitflag $fr.="x08x00";//compressionmethod $fr.=$hexdtime;//lastmodtimeanddate //"localfileheader"segment $unc_len=strlen($data); $crc=crc32($data); $zdata=gzcompress($data); $c_len=strlen($zdata); $zdata=substr(substr($zdata,0,strlen($zdata)-4),2);//fixcrcbug $fr.=pack('V',$crc);//crc32 $fr.=pack('V',$c_len);//compressedfilesize $fr.=pack('V',$unc_len);//uncompressedfilesize $fr.=pack('v',strlen($name));//lengthoffilename $fr.=pack('v',0);//extrafieldlength $fr.=$name; //"filedata"segment $fr.=$zdata; //"datadescriptor"segment(optionalbutnecessaryifarchiveisnot //servedasfile) $fr.=pack('V',$crc);//crc32 $fr.=pack('V',$c_len);//compressedfilesize $fr.=pack('V',$unc_len);//uncompressedfilesize //addthisentrytoarray $this->datasec[]=$fr; $new_offset=strlen(implode('',$this->datasec)); //nowaddtocentraldirectoryrecord $cdrec="x50x4bx01x02"; $cdrec.="x00x00";//versionmadeby $cdrec.="x14x00";//versionneededtoextract $cdrec.="x00x00";//genpurposebitflag $cdrec.="x08x00";//compressionmethod $cdrec.=$hexdtime;//lastmodtime&date $cdrec.=pack('V',$crc);//crc32 $cdrec.=pack('V',$c_len);//compressedfilesize $cdrec.=pack('V',$unc_len);//uncompressedfilesize $cdrec.=pack('v',strlen($name));//lengthoffilename $cdrec.=pack('v',0);//extrafieldlength $cdrec.=pack('v',0);//filecommentlength $cdrec.=pack('v',0);//disknumberstart $cdrec.=pack('v',0);//internalfileattributes $cdrec.=pack('V',32);//externalfileattributes-'archive'bitset $cdrec.=pack('V',$this->old_offset);//relativeoffsetoflocalheader $this->old_offset=$new_offset; $cdrec.=$name; //optionalextrafield,filecommentgoeshere //savetocentraldirectory $this->ctrl_dir[]=$cdrec; }//endofthe'addFile()'method /** *Dumpsoutfile * *@returnstringthezippedfile * *@accesspublic */ functionfile() { $data=implode('',$this->datasec); $ctrldir=implode('',$this->ctrl_dir); return $data. $ctrldir. $this->eof_ctrl_dir. pack('v',sizeof($this->ctrl_dir)).//total#ofentries"onthisdisk" pack('v',sizeof($this->ctrl_dir)).//total#ofentriesoverall pack('V',strlen($ctrldir)).//sizeofcentraldir pack('V',strlen($data)).//offsettostartofcentraldir "x00x00";//.zipfilecommentlength }//endofthe'file()'method }//endofthe'PHPZip'class ?>
用法:
$zipfiles=array("/root/pooy/test1.txt","/root/pooy/test2.txt"); $z=newPHPZip(); //$randomstr=random(8); $zipfile=TEMP."/photocome_".$groupid.".zip"; $z->Zip($zipfiles,$zipfile);
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP操作zip文件及压缩技巧总结》、《php文件操作总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。