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读写文件的方法(生成HTML)
Nov 27 PHP
php实现mysql同步的实现方法
Oct 21 PHP
smarty模板嵌套之include与fetch性能测试
Dec 05 PHP
php中用数组的方法设置cookies
Apr 21 PHP
php中stream(流)的用法
Mar 25 PHP
php获取文件后缀的9种方法
Mar 22 PHP
示例详解Laravel重置密码代码重构
Aug 10 PHP
PHP数组操作简单案例分析
Oct 15 PHP
php让json_encode不自动转义斜杠“/”的方法
Apr 27 PHP
PHP7 其他语言层面的修改
Mar 09 PHP
PHP命令行与定时任务
Apr 01 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
经典PHP加密解密函数Authcode()修复版代码
2015/04/05 PHP
Yii2 rbac权限控制之菜单menu实例教程
2016/04/28 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
2017/04/19 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
javascript 操作Word和Excel的实现代码
2009/10/26 Javascript
html中的input标签的checked属性jquery判断代码
2012/09/19 Javascript
Js,alert出现乱码问题的解决方法
2013/06/19 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
2014/07/17 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
javascript实现信息增删改查的方法
2015/07/25 Javascript
form表单序列化详解(推荐)
2017/08/15 Javascript
AJAX XMLHttpRequest对象创建使用详解
2020/08/20 Javascript
Python通过递归遍历出集合中所有元素的方法
2015/02/25 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
使用Python实现一个栈判断括号是否平衡
2018/08/23 Python
Python多线程处理实例详解【单进程/多进程】
2019/01/30 Python
python numpy实现文件存取的示例代码
2019/05/26 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
使用python模拟高斯分布例子
2019/12/09 Python
详解CSS中iconfont的使用
2015/08/04 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
Contém1g官网:巴西彩妆品牌
2020/01/17 全球购物
高级Java程序员面试题
2016/06/23 面试题
实习评语
2013/12/16 职场文书
演讲比赛获奖感言
2014/02/02 职场文书
致铅球运动员加油稿
2014/02/13 职场文书
简单的项目建议书模板
2014/03/12 职场文书
团日活动总结怎么写
2014/06/25 职场文书
建筑节能汇报材料
2014/08/22 职场文书
指导教师推荐意见
2015/06/05 职场文书
我的中国梦心得体会范文
2016/01/05 职场文书
为什么你写的height:100%不起作用
2021/05/10 HTML / CSS
解决SpringBoot跨域的三种方式
2021/06/26 Java/Android
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
Mysql实现简易版搜索引擎的示例代码
2021/08/30 MySQL