下载鸥 > 网站下载 > 开发教程 > 帝国CMS

帝国CMS二次开发压缩与解压缩功能使用教程

476 2020-11-12 14:11:30

收藏

简述

在使用帝国CMS建站,用到压缩与解压缩功能的很少,所以很少相关的文章。使用这些功能的基本是一些网页展示下载站一样。

在使用帝国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');//添加指定目录


以上就是帝国cms压缩与解压缩的核心代码,如果你有一定基础,很容易根据核心代码集成到自己的系统里,如果你没有基础,那么……,真的有点难。

本文地址:https://xzo.com.cn/develop/empire/118.html

有帮助,很赞!

信息来源:精准像素
导出教程 下载word版教程
发表评论 共有条评论
关于帝国CMS


帝国cms是一款功能极为强大的cms程序,性能强悍、安全性高,可轻松支持10万数据,高级开发人员可制作出能容纳千万数据量的网站,是国内最出色的开源cms程序之一,推荐企业用户使用

当前最新版本为7.5,8.0版本即将上线,新版本的核心优化点在于多终端的适配。

推荐帝国CMS开发教程
帝国CMS怎样做百万、千万级别数据库的网站?
帝国CMS怎样做百万、千万级别数据库的网站?

帝国CMS作为最强大的开源cms之一,其程序效率毫无疑问。但,帝国CMS真的可以做...

20 1514
帝国cms怎样默认显示副标题ftitle,副标题为空时显示标题?
帝国cms怎样默认显示副标题ftitle,副标题为空时显示标题?

在帝国cms的开发应用中,标题作为文章的主体往往需要表意明显才能获得更好的...

1 477
帝国cms生成自定义列表页怎样压缩?
帝国cms生成自定义列表页怎样压缩?

帝国cms生成的静态页面,大多是在gethtml()函数下实现代码压缩,但自定义页面、...

0 405
帝国cms某个栏目使用完全自定义的分页功能
帝国cms某个栏目使用完全自定义的分页功能

帝国CMS列表页的分页函数是用系统设置中的分页函数,修改都是在系统设置里进...

0 907
帝国cms投稿后怎样跳转指定页面?
帝国cms投稿后怎样跳转指定页面?

帝国cms投稿后怎样跳转的问题一直让很多人困扰。有人想跳到个人中心,也有人...

1 431
帝国cms显示的发布时间与实际发布时间相差了8小时怎么办?
帝国cms显示的发布时间与实际发布时间相差了8小时怎么办?

有少量客户在使用帝国cms建站时发现一个问题:帝国cms显示的发布时间与真实的...

0 469
填坑笔记:帝国cms栏目部分页面无法访问的原因与解决办法
填坑笔记:帝国cms栏目部分页面无法访问的原因与解决办法

在网站开发的过程中,我们可能因为这样那样的问题遇到无数的出错。有可能是代...

0 428
帝国cms防火墙拦截会员投稿关键词无效怎么办?
帝国cms防火墙拦截会员投稿关键词无效怎么办?

帝国cms拦截关键词可以在用户投稿输入指定关键词后进行拦截,并变成白屏。功...

3 421
推荐插件
帝国cms自动给正文关键词添加tag内链
帝国cms自动给正文关键词添加tag内链

帝国cms有自带的给关键词添加内链功能,但需要手动添加关键词,容易出现疏漏和...

0 811
帝国cms在线考试系统模板插件
帝国cms在线考试系统模板插件

一直没看到好用的帝国cms在线考试插件,所以自己开发了一款。在线考试插件用...

0 1258
帝国cms访问统计ip地址链接与封禁插件下载
帝国cms访问统计ip地址链接与封禁插件下载

下载鸥开发了这款帝国cms封禁ip插件,自动记录访问情况,让我们可以更快的识别...

0 985
帝国cms联想词搜索高级搜索插件下载
帝国cms联想词搜索高级搜索插件下载

帝国CMS自带的搜索功能虽然强大,但也有很强的局限性 -- 必须关键词完全匹配...

0 736
帝国cms纳米数据接口(足球比赛中最新数据)
帝国cms纳米数据接口(足球比赛中最新数据)

帝国cms 对接纳米数据(www.nami.com)接口,本接口主要接收、整理足球比赛实时数...

0 319
帝国CMS内网用户静态站点文章访客统计插件
帝国CMS内网用户静态站点文章访客统计插件

本插件适用于内网用户,可查看单篇文章访问者ip地址。如果添加访问者ip组,可查...

0 537
帝国cms网站会员登录与退出历史记录日志插件
帝国cms网站会员登录与退出历史记录日志插件

帝国cms默认只有上次登录时间与ip,没有一个记录清单,所以今天,我们分享这个帝...

0 357
帝国cms百度AI图像无损放大api接口对接插件
帝国cms百度AI图像无损放大api接口对接插件

通过本插件,可以实现帝国cms网站对接百度云api实现图像无损放大的功能。经过...

0 438
客服QQ:341553759
扫码咨询 常见问题 >
官方交流群:90432500
点击加入