配色: 字号:
一个完美的PHP ZIP压缩类代码
2016-08-20 | 阅:  转:  |  分享 
  
一个完美的PHPZIP压缩类代码

本程序可以快速的实现把我们的文件利用php压缩类压缩成我们想的zip,或者rar的压缩包,后缀名可以自定义哦,压缩算法是来自国外一个网站抄的。

首先实例化,然后传参。两个参数。第一个关于你文件地址的一个Array。第二个是要你要保存的压缩包文件的绝对地址。

Forexample:

?代码如下 复制代码 ???????$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的ZIP压缩类如下:

?代码如下 复制代码
classPHPZip{???functionZip($dir,$zipfilename)???{???????if(@function_exists(''gzcompress''))???????{???????????????$curdir=getcwd();???????????if(is_array($dir))????????????{???????????????????$filelist=$dir;???????????}???????????else????????????{???????????????$filelist=$this->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,timeinlowtwobytesallowwww.shanxiwang.netingmagnitudecomparison).????????@param?integer?thecurrentUnixtimestamp????????@returninteger?thecurrentdateinafourbyteDOSformat????????@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????????@param?string??filecontents????@param?string??nameofthefileinthearchive(maycontainsthepath)????@param?integer?thecurrenttimestamp????????@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

???/????Dumps?outfile????????@return?string?thezippedfile????????@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?>

献花(0)
+1
(本文系网络学习天...首藏)