php实现zip压缩文件解压缩代码分享(简单易懂)


Posted in PHP onMay 10, 2014

仔细的研究了一下,原来用php写的解压程序效率比想象的还是高很多的,既然这么好,干脆再优化一下后用到自己后台中,虽然现在大部分空间的控制面板中有压缩和解压这个功能,但是毕竟有时候有些麻烦。

做这个之前,没有接触过php压缩这一块,网上搜了一些,大多数都是php压缩类、压缩函数,少则几百行,多的就几千行代码。这对于我这种新手来说很摸不到头脑,再说我也不用这么复杂的功能。最后参考函数手册,理清楚了几个相关的函数后,就明白了怎么去整了。

php实现zip压缩文件解压缩代码分享(简单易懂)

记得要开启 zip ,把 php.ini 中的 extension=php_zip.dll 前面的分号去掉。

源码范例:

<?php
//需开启配置 php_zip.dll
//phpinfo();
header("Content-type:text/html;charset=utf-8");
function get_zip_originalsize($filename, $path) {
 //先判断待解压的文件是否存在
 if(!file_exists($filename)){
  die("文件 $filename 不存在!");
 } 
 $starttime = explode(' ',microtime()); //解压开始的时间
 //将文件名和路径转成windows系统默认的gb2312编码,否则将会读取不到
 $filename = iconv("utf-8","gb2312",$filename);
 $path = iconv("utf-8","gb2312",$path);
 //打开压缩包
 $resource = zip_open($filename);
 $i = 1;
 //遍历读取压缩包里面的一个个文件
 while ($dir_resource = zip_read($resource)) {
  //如果能打开则继续
  if (zip_entry_open($resource,$dir_resource)) {
   //获取当前项目的名称,即压缩包里面当前对应的文件名
   $file_name = $path.zip_entry_name($dir_resource);
   //以最后一个“/”分割,再用字符串截取出路径部分
   $file_path = substr($file_name,0,strrpos($file_name, "/"));
   //如果路径不存在,则创建一个目录,true表示可以创建多级目录
   if(!is_dir($file_path)){
    mkdir($file_path,0777,true);
   }
   //如果不是目录,则写入文件
   if(!is_dir($file_name)){
    //读取这个文件
    $file_size = zip_entry_filesize($dir_resource);
    //最大读取6M,如果文件过大,跳过解压,继续下一个
    if($file_size<(1024*1024*6)){
     $file_content = zip_entry_read($dir_resource,$file_size);
     file_put_contents($file_name,$file_content);
    }else{
     echo "<p> ".$i++." 此文件已被跳过,原因:文件过大, -> ".iconv("gb2312","utf-8",$file_name)." </p>";
    }
   }
   //关闭当前
   zip_entry_close($dir_resource);
  }
 }
 //关闭压缩包
 zip_close($resource); 
 $endtime = explode(' ',microtime()); //解压结束的时间
 $thistime = $endtime[0]+$endtime[1]-($starttime[0]+$starttime[1]);
 $thistime = round($thistime,3); //保留3为小数
 echo "<p>解压完毕!,本次解压花费:$thistime 秒。</p>";
}
$size = get_zip_originalsize('20131101.zip','temp/');
?>

测试解压了一个300多KB的小文件,花了0.115秒,测试解压了一个30多MB的(网页文件,小文件比较多),花了20多秒。

PHP 相关文章推荐
简体中文转换为繁体中文的PHP函数
Oct 09 PHP
PHP 调试工具Debug Tools
Apr 30 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
Jun 29 PHP
适用于抽奖程序、随机广告的PHP概率算法实例
Apr 09 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
PHP数组array类常见操作示例
May 15 PHP
php使用正则过滤js脚本代码实例
May 10 #PHP
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子
May 10 #PHP
php中curl和file_get_content的区别
May 10 #PHP
php实现文件下载功能的几个代码分享
May 10 #PHP
php按百分比生成缩略图的代码分享
May 10 #PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
May 10 #PHP
php下获取http状态的实现代码
May 09 #PHP
You might like
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
php文件上传的两种实现方法
2016/04/04 PHP
PHP如何将XML转成数组
2016/04/04 PHP
DWZ+ThinkPHP开发时遇到的问题分析
2016/12/12 PHP
php+webSoket实现聊天室示例代码(附源码)
2017/02/17 PHP
form自动提交实例讲解
2017/07/10 PHP
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
jQuery自定义组件(导入组件)
2016/11/08 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
JS实现动态星空背景效果
2019/11/01 Javascript
如何优雅地取消 JavaScript 异步任务
2020/03/22 Javascript
vue el-tree 默认展开第一个节点的实现代码
2020/05/15 Javascript
js异步接口并发数量控制的方法示例
2020/11/22 Javascript
[03:17]2016完美“圣”典风云人物:冷冷专访
2016/12/08 DOTA
精确查找PHP WEBSHELL木马的方法(1)
2011/04/12 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
基于Python __dict__与dir()的区别详解
2017/10/30 Python
Python制作豆瓣图片的爬虫
2017/12/28 Python
Python实现提取XML内容并保存到Excel中的方法
2018/09/01 Python
利用python循环创建多个文件的方法
2018/10/25 Python
Python实现的特征提取操作示例
2018/12/03 Python
Python使用到第三方库PyMuPDF图片与pdf相互转换
2019/05/03 Python
Python学习之os模块及用法
2020/06/03 Python
HTML5 微格式和相关的属性名称
2010/02/10 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
Charlotte Tilbury英国官网:英国彩妆品牌
2017/05/26 全球购物
阿根廷票务网站:StubHub阿根廷
2018/04/13 全球购物
泰国网上购物:Shopee泰国
2018/09/14 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
大一学生职业生涯规划
2014/03/11 职场文书
经济类毕业生求职信
2014/06/26 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2015年销售人员工作总结
2015/04/07 职场文书
2016年公司中秋节致辞
2015/11/26 职场文书