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&amp;&amp;mysql)一
Oct 09 PHP
php中几种常见安全设置详解
Apr 06 PHP
CodeIgniter使用phpcms模板引擎
Nov 12 PHP
php中的mongodb select常用操作代码示例
Sep 06 PHP
PHP Streams(流)详细介绍及使用
May 12 PHP
php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法
May 25 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
详谈php中 strtr 和 str_replace 的效率问题
May 14 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
php模拟实现斗地主发牌
Apr 22 PHP
PHP如何使用cURL实现Get和Post请求
Jul 11 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初学者头疼十四条问题大总结
2008/11/12 PHP
php array_filter除去数组中的空字符元素
2020/06/21 PHP
windows环境下php配置memcache的具体操作步骤
2013/06/09 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
PHP-FPM运行状态的实时查看及监控详解
2016/11/18 PHP
解析PHP之提取多维数组指定列的方法
2017/01/03 PHP
Laravel实现ApiToken认证请求
2019/10/14 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
学习YUI.Ext 第七天--关于View&amp;JSONView
2007/03/10 Javascript
Firebug 字幕文件JSON地址获取代码
2009/10/28 Javascript
新鲜出炉的js tips提示效果
2011/04/03 Javascript
探讨jQuery的ajax使用场景(c#)
2013/12/03 Javascript
深入浅析NodeJs并发异步的回调处理
2015/12/21 NodeJs
使用JavaScript进行表单校验功能
2017/08/01 Javascript
webpack4简单入门实例
2018/09/06 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
讲解Python中fileno()方法的使用
2015/05/24 Python
Python操作Oracle数据库的简单方法和封装类实例
2018/05/07 Python
Python绘制堆叠柱状图的实例
2019/07/09 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
python读取tif图片时保留其16bit的编码格式实例
2020/01/13 Python
python实现在线翻译功能
2020/03/03 Python
python 利用toapi库自动生成api
2020/10/19 Python
html5+css3气泡组件的实现
2014/11/21 HTML / CSS
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
HTML5 Web Workers之网站也能多线程的实现
2013/04/24 HTML / CSS
丝芙兰香港官网:Sephora香港
2018/03/13 全球购物
SQL SERVER面试资料
2013/03/30 面试题
银行办理业务介绍信
2014/01/18 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
2014年乡镇人大工作总结
2014/11/25 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
2015年法院工作总结范文
2015/04/28 职场文书
中小学生安全教育观后感
2015/06/17 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python
解决Swagger2返回map复杂结构不能解析的问题
2021/07/02 Java/Android