在运用帝国CMS建站,用到紧缩与解紧缩功用的很少,所以很少相关的文章。运用这些功用的基本是一些网页展现下载站相同。
在帝国CMS体系文件中,e/class/phpzip.inc.php是专门处理文件紧缩功用的,阅览代码你会发现,它没有解紧缩功用。
网站有个模板版块供给各种网页模板、手机模板下载功用。体系除了录入模板的介绍信息外,还需求上传模板截图,模板附件等。但是有些模板页面实在太多了,不能逐个截图展现,再说假如截图过多,1是吃力,2是费网络资源,3是用户体会也欠好。所以就必须要有一些解压文件包的功用,把上传的附件解压到某个指定目录,构成内部静态网页,让用户能够预览模板,实在体会模板概况。
功用代码制造
查了一下相关材料,发现写个php解紧缩文件功用仍是比较复杂的,所以就从网上找到他人写好的代码,融合到帝国CMS里,咱们能够把以下代码复制到e/class/phpzip.inc.php文件第213行下
//解压文件部分 functionunZip($zipfile,$to,$index=Array(-1)){ $ok=0; $zip=@fopen($zipfile,'rb'); if(!$zip){return(-1);} $cdir=$this->ReadCentralDir($zip,$zipfile); $pos_entry=$cdir['offset']; if(!is_array($index)){$index=array($index);} for($i=0;$index[$i];$i++) { if(intval($index[$i])!=$index[$i]||$index[$i]>$cdir['entries']) { return(-1); } } for($i=0;$i<$cdir['entries'];$i++) { @fseek($zip,$pos_entry); $header=$this->ReadCentralFileHeaders($zip); $header['index']=$i; $pos_entry=ftell($zip); @rewind($zip); fseek($zip,$header['offset']); if(in_array("-1",$index)||in_array($i,$index)) { $stat[$header['filename']]=$this->ExtractFile($header,$to,$zip); } } fclose($zip); return$stat; } functionReadCentralDir($zip,$zipfile){ $size=filesize($zipfile); $max_size=($size<277)?$size:277; @fseek($zip,$size-$max_size); $pos=ftell($zip); $bytes=0x00000000; while($pos<$size) { $byte=@fread($zip,1); $bytes=($bytes<<8)|Ord($byte); $pos++; if($bytes==0x504b0506){break;} } $data=unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',fread($zip,18)); $centd['comment']=($data['comment_size']!=0)?fread($zip,$data['comment_size']):'';//注释 $centd['entries']=$data['entries']; $centd['disk_entries']=$data['disk_entries']; $centd['offset']=$data['offset']; $centd['disk_start']=$data['disk_start']; $centd['size']=$data['size']; $centd['disk']=$data['disk']; return$centd; } functionReadCentralFileHeaders($zip){ $binary_data=fread($zip,46); $header=unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset',$binary_data); $header['filename']=($header['filename_len']!=0)?fread($zip,$header['filename_len']):''; $header['extra']=($header['extra_len']!=0)?fread($zip,$header['extra_len']):''; $header['comment']=($header['comment_len']!=0)?fread($zip,$header['comment_len']):''; if($header['mdate']&&$header['mtime']) { $hour=($header['mtime']&0xF800)>>11; $minute=($header['mtime']&0x07E0)>>5; $seconde=($header['mtime']&0x001F)*2; $year=(($header['mdate']&0xFE00)>>9)+1980; $month=($header['mdate']&0x01E0)>>5; $day=$header['mdate']&0x001F; $header['mtime']=mktime($hour,$minute,$seconde,$month,$day,$year); }else{ $header['mtime']=time(); } $header['stored_filename']=$header['filename']; $header['status']='ok'; if(substr($header['filename'],-1)=='/'){$header['external']=0x41FF0010;}//判别是否文件夹 return$header; } functionExtractFile($header,$to,$zip){ $header=$this->readfileheader($zip); $pthss=""; if(substr($to,-1)!="/"){$to.="/";} if(!@is_dir($to)){@mkdir($to,0777);} $pth=explode("/",dirname($header['filename'])); for($i=0;isset($pth[$i]);$i++){ if(!$pth[$i]){continue;} $pthss.=$pth[$i]."/"; if(!is_dir($to.$pthss)){@mkdir($to.$pthss,0777);} } if(!($header['external']==0x41FF0010)&&!($header['external']==16)) { if($header['compression']==0) { $fp=@fopen($to.$header['filename'],'wb'); if(!$fp){return(-1);} $size=$header['compressed_size']; while($size!=0) { $read_size=($size<2048?$size:2048); $buffer=fread($zip,$read_size); $binary_data=pack('a'.$read_size,$buffer); @fwrite($fp,$binary_data,$read_size); $size-=$read_size; } fclose($fp); touch($to.$header['filename'],$header['mtime']); }else{ $fp=@fopen($to.$header['filename'].'.gz','wb'); if(!$fp){return(-1);} $binary_data=pack('va1a1Va1a1',0x8b1f,Chr($header['compression']),Chr(0x00),time(),Chr(0x00),Chr(3)); fwrite($fp,$binary_data,10); $size=$header['compressed_size']; while($size!=0) { $read_size=($size<1024?$size:1024); $buffer=fread($zip,$read_size); $binary_data=pack('a'.$read_size,$buffer); @fwrite($fp,$binary_data,$read_size); $size-=$read_size; } $binary_data=pack('VV',$header['crc'],$header['size']); fwrite($fp,$binary_data,8); fclose($fp); $gzp=@gzopen($to.$header['filename'].'.gz','rb')ordie("Cettearchiveestcompress!"); if(!$gzp){return(-2);} $fp=@fopen($to.$header['filename'],'wb'); if(!$fp){return(-1);} $size=$header['size']; while($size!=0) { $read_size=($size<2048?$size:2048); $buffer=gzread($gzp,$read_size); $binary_data=pack('a'.$read_size,$buffer); @fwrite($fp,$binary_data,$read_size); $size-=$read_size; } fclose($fp);gzclose($gzp); touch($to.$header['filename'],$header['mtime']); @unlink($to.$header['filename'].'.gz'); } } returntrue; } functionReadFileHeader($zip){ $binary_data=fread($zip,30); $data=unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len',$binary_data); $header['filename']=fread($zip,$data['filename_len']); $header['extra']=($data['extra_len']!=0)?fread($zip,$data['extra_len']):''; $header['compression']=$data['compression']; $header['size']=$data['size']; $header['compressed_size']=$data['compressed_size']; $header['crc']=$data['crc']; $header['flag']=$data['flag']; $header['mdate']=$data['mdate']; $header['mtime']=$data['mtime']; if($header['mdate']&&$header['mtime']){ $hour=($header['mtime']&0xF800)>>11; $minute=($header['mtime']&0x07E0)>>5; $seconde=($header['mtime']&0x001F)*2; $year=(($header['mdate']&0xFE00)>>9)+1980; $month=($header['mdate']&0x01E0)>>5; $day=$header['mdate']&0x001F; $header['mtime']=mktime($hour,$minute,$seconde,$month,$day,$year); }else{ $header['mtime']=time(); } $header['stored_filename']=$header['filename']; $header['status']="ok"; return$header; } functionGetOneFileName($zipfile){ $zip=@fopen($zipfile,'rb'); $v=$this->ReadFileHeader($zip); if(substr($v['filename'],-1)=='/'){ return$v['filename']; }else{ return''; } }
怎么运用解紧缩功用
在完结上一步代码复制粘贴后,在你要运用的页面中引进
requireECMS_PATH.'e/class/phpzip.inc.php'; $z=newPHPZip();//新树立一个zip的类 $res=$z->unZip('你要解压的文件','解压到那个文件夹下');//两个地址必定要是肯定目录 /* *举例 *$res=$z->unZip(ECMS_PATH.'http://www.11px.cn/d/file/mb/qianduanmb/20190426/abc.rar',ECMS_PATH.'/demo/html/abc'); */
在实践的运用中,要解压附件并不是上面几行代码就能完结的,下面说是对此问题的解压思路及代码上的完成
1、获取实在地址。想要得到某条信息附件的实在地址,咱们需求拿到信息的ID,经过过程查询,然后解析获取。
2、界说想要解压到目录的规矩
3、创立目录(假如有就越过,没有就新创立)
4、判别紧缩包里榜首层是文件仍是文件夹
5、履行解紧缩
6、更新数据
代码:
$z=newPHPZip();//新树立一个zip的类 $r=$empire->fetch1("selectdownpathfrom{$dbtbpre}ecms_download_data_1WHEREid=$idlimit1");//查询附件 $path_r=explode("rn",$r[downpath]);//解析下载地址 $showdown_r=explode("::::::",$path_r[0]);//拆分榜首行下载地址 $downurl=$showdown_r[1];//将榜首行下载地址赋值给$downurl变量 if($downurl){//假如存在下载地址 $zipfile=ECMS_PATH.$downurl;//组合服务器肯定附件地址,如:D:wwwrootwwwhttp://www.11px.cn/d/file/mb/qianduanmb/20190426/abc.rar $tofile=ECMS_PATH.'/demo/'.$id.'/';//界说想要解压到目录的规矩 if(!is_dir($tofile)){//创立目录 @mkdir($tofile,0777,ture); @chmod($tofile,0777); } $mulu=$z->GetOneFileName($zipfile);//判别紧缩包里榜首层是文件仍是文件夹 $mulu=iconv('gbk','utf-8',$mulu);//将中文目录转码 $res=$z->unZip($zipfile,$tofile);//履行解紧缩操作 if($res){ $ysurl='/demo/'.$id.'/'.$mulu; $empire->query("update{$dbtbpre}ecms_downloadsetysurl='$ysurl'WHEREid=$id");//更新数据 returnjson_encode(array('error'=>0,'ysurl'=>$ysurl,'msg'=>'生成演示目录成功')); } }
以上是解紧缩的中心代码,想要集成到信息里能够把代码封装成函数,以便后期调用。假如不会的话,能够联络本站站长做付费操作。下面说说帝国CMS的紧缩功用
帝国CMS紧缩文件夹功用
requireECMS_PATH.'e/class/phpzip.inc.php';//引进类文件 $z=newPHPZip();//新树立一个zip的类 $z->Zip('要紧缩的文件夹','紧缩到那个文件夹下'); //举例:$z->Zip('D:wampwwwdgcmsaa','D:wampwwwdgcmsbbaa.zip');//增加指定目录
总结:以上是中心代码,假如你有必定根底,很简单依据中心代码集成到自己的体系里,假如你没有根底,那么……,真的有点难。
声明:有的资源均来自网络转载,版权归原作者所有,如有侵犯到您的权益 请联系邮箱:123456@qq.com 我们将配合处理!
原文地址:帝国CMS二次开发压缩与解压缩功能使用教程发布于2022-06-23 07:43:32