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 相关文章推荐
附件名前加网站名
Mar 23 PHP
php判断字符以及字符串的包含方法属性
Aug 30 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
php的zip解压缩类pclzip使用示例
Mar 14 PHP
php树型类实例
Dec 05 PHP
php使用memcoder将视频转成mp4格式的方法
Mar 12 PHP
thinkphp命名空间用法实例详解
Dec 30 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
php中通用的excel导出方法实例
Dec 30 PHP
原生JS实现Ajax通过GET方式与PHP进行交互操作示例
May 12 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
php操作redis常见方法示例【key与value操作】
Apr 14 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代码
2010/08/08 PHP
php连接mssql的一些相关经验及注意事项
2013/02/05 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
jQuery 写的简单打字游戏可以提示正确和错误的次数
2014/07/01 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
JS点击链接后慢慢展开隐藏着图片的方法
2015/02/17 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
2016/12/05 Javascript
基于JavaScript实现滑动门效果
2017/03/16 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
vue-cli设置publicPath小记
2020/04/14 Javascript
vue离开当前页面触发的函数代码
2020/09/01 Javascript
vue中axios封装使用的完整教程
2021/03/03 Vue.js
python代码制作configure文件示例
2014/07/28 Python
python下10个简单实例代码
2017/11/15 Python
python实现周期方波信号频谱图
2018/07/21 Python
运行tensorflow python程序,限制对GPU和CPU的占用操作
2020/02/06 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
Django通过json格式收集主机信息
2020/05/29 Python
Python函数递归调用实现原理实例解析
2020/08/11 Python
为什么使用接口?
2014/08/13 面试题
毕业生物理教师求职信
2013/10/17 职场文书
战略合作意向书
2014/07/29 职场文书
优秀员工事迹材料
2014/12/20 职场文书
公司仓库管理制度
2015/08/04 职场文书
2019新员工试用期转正工作总结范文
2019/08/21 职场文书
Html5大屏数据可视化开发的实现
2021/06/11 HTML / CSS
Canvas绘制像素风图片的示例代码
2021/09/25 HTML / CSS
Python中文分词库jieba(结巴分词)详细使用介绍
2022/04/07 Python
python和C/C++混合编程之使用ctypes调用 C/C++的dll
2022/04/29 Python
maven 解包依赖项中的文件的解决方法
2022/07/15 Java/Android