php ZipArchive压缩函数详解实例


Posted in PHP onNovember 06, 2013

用ZipArchive压缩文件,这个是php的扩展类,自php5.2版本以后就已经支持这个扩展,如果你在使用的时候出现错误,查看下php.ini里面的extension=php_zip.dll前面的分号有没有去掉,然后再重启Apache这样才能使用这个类库。
例1、生成zip 压缩文件

<?php 
/* 生成zip 压缩文件 */
function create_zip($files = array(),$destination = '',$overwrite = false) { 
    //if the zip file already exists and overwrite is false, return false 
    if(file_exists($destination) && !$overwrite) { return false; } 
    //vars 
    $valid_files = array(); 
    //if files were passed in... 
    if(is_array($files)) { 
        //cycle through each file 
        foreach($files as $file) { 
            //make sure the file exists 
            if(file_exists($file)) { 
                $valid_files[] = $file; 
            } 
        } 
    } 
    //if we have good files... 
    if(count($valid_files)) { 
        //create the archive 
        $zip = new ZipArchive(); 
        if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) { 
            return false; 
        } 
        //add the files 
        foreach($valid_files as $file) { 
            $file_info_arr= pathinfo($file); 
            $zip->addFile($file,$file_info_arr['basename']);//去掉层级目录 
        } 
        //debug 
        //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;         //close the zip -- done! 
        $zip->close(); 
        //check to make sure the file exists 
        return file_exists($destination); 
    } 
    else
    { 
        return false; 
    } 
} 
define('ROOTPATH',dirname ( __FILE__ )); //网站路径 
$files_to_zip = array( 
    ROOTPATH.DIRECTORY_SEPARATOR.'PHP+jQuery+Cookbook.pdf', 
    ROOTPATH.DIRECTORY_SEPARATOR.'TurboListerZeroTemplate.csv'
); 
//if true, good; if false, zip creation failed 
$filename='my-archive.zip'; 
$result = create_zip($files_to_zip,$filename);
 

例2 、压缩文件夹下面的所有文
<?php 
/* 
php zip压缩文件夹下面的所有文件 
*/
class HZip 
{ 
  /** 
   * 添加文件和子目录的文件到zip文件 
   * @param string $folder 
   * @param ZipArchive $zipFile 
   * @param int $exclusiveLength Number of text to be exclusived from the file path. 
   */
  private static function folderToZip($folder, &$zipFile, $exclusiveLength) { 
    $handle = opendir($folder); 
    while (false !== $f = readdir($handle)) { 
      if ($f != '.' && $f != '..') { 
        $filePath = "$folder/$f"; 
        // Remove prefix from file path before add to zip. 
        $localPath = substr($filePath, $exclusiveLength); 
        if (is_file($filePath)) { 
          $zipFile->addFile($filePath, $localPath); 
        } elseif (is_dir($filePath)) { 
          // 添加子文件夹 
          $zipFile->addEmptyDir($localPath); 
          self::folderToZip($filePath, $zipFile, $exclusiveLength); 
        } 
      } 
    } 
    closedir($handle); 
  }   /** 
   * Zip a folder (include itself). 
   * Usage: 
   *   HZip::zipDir('/path/to/sourceDir', '/path/to/out.zip'); 
   * 
   * @param string $sourcePath Path of directory to be zip. 
   * @param string $outZipPath Path of output zip file. 
   */
  public static function zipDir($sourcePath, $outZipPath) 
  { 
    $pathInfo = pathInfo($sourcePath); 
    $parentPath = $pathInfo['dirname']; 
    $dirName = $pathInfo['basename']; 
    $sourcePath=$parentPath.'/'.$dirName;//防止传递'folder' 文件夹产生bug 
    $z = new ZipArchive(); 
    $z->open($outZipPath, ZIPARCHIVE::CREATE);//建立zip文件 
    $z->addEmptyDir($dirName);//建立文件夹 
    self::folderToZip($sourcePath, $z, strlen("$parentPath/")); 
    $z->close(); 
  } 
} 
//使用方法 
HZip::zipDir('yourlife', 'yourlife.zip'); 
?>
 

1.ZipArchive::addEmptyDir
添加一个新的文件目录
2.ZipArchive::addFile
将文件添加到指定zip压缩包中。
3.ZipArchive::addFromString
添加的文件同时将内容添加进去
4.ZipArchive::close
关闭ziparchive
5.ZipArchive::extractTo
将压缩包解压
6.ZipArchive::open
打开一个zip压缩包
7.ZipArchive::getStatusString
返回压缩时的状态内容,包括错误信息,压缩信息等等
8.ZipArchive::deleteIndex
删除压缩包中的某一个文件,如:deleteIndex(0)删除第一个文件
9.ZipArchive::deleteName
删除压缩包中的某一个文件名称,同时也将文件删除。

PHP 相关文章推荐
php实现从ftp服务器上下载文件树到本地电脑的程序
Feb 10 PHP
如何使用php判断服务器是否是HTTPS连接
Jul 05 PHP
PHP中设置一个严格30分钟过期Session面试题的4种答案
Jul 30 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
Dec 21 PHP
[原创]php求圆周率的简单实现方法
May 30 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
Laravel的throttle中间件失效问题解决方法
Oct 09 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
Jun 28 PHP
PHP简单实现二维数组的矩阵转置操作示例
Nov 24 PHP
PHP操作Redis常用技巧总结
Apr 24 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
PHP代码覆盖率统计详解
Jul 22 PHP
php根据分类合并数组的方法实例详解
Nov 06 #PHP
php foreach循环中使用引用的问题
Nov 06 #PHP
php用正则表达式匹配中文实例详解
Nov 06 #PHP
php引用传值实例详解学习
Nov 06 #PHP
php二维数组排序详解
Nov 06 #PHP
PHP Curl多线程原理实例详解
Nov 06 #PHP
php二维数组用键名分组相加实例函数
Nov 06 #PHP
You might like
使用XDebug调试及单元测试覆盖率分析
2011/01/27 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
PHP中的类型提示(type hinting)功能介绍
2015/07/01 PHP
基于PHP-FPM进程池探秘
2017/10/17 PHP
laravel 之 Eloquent 模型修改器和序列化示例
2019/10/17 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
ajax上传时参数提交不更新等相关问题
2012/12/11 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
基于jQuery实现下拉框
2014/11/24 Javascript
jQuery中iframe的操作(点击按钮新增窗口)
2016/04/20 Javascript
JS实现本地存储信息的方法(基于localStorage与userData)
2017/02/18 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
vue-cli3.0 特性解读
2018/04/22 Javascript
vue mint-ui tabbar变组件使用
2018/05/04 Javascript
基于Vue 服务端Cookies删除的问题
2018/09/21 Javascript
Node.js API详解之 timer模块用法实例分析
2020/05/07 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
[03:12]完美世界DOTA2联赛PWL DAY6集锦
2020/11/05 DOTA
处理Python中的URLError异常的方法
2015/04/30 Python
详解 Python中LEGB和闭包及装饰器
2017/08/03 Python
Django数据库操作的实例(增删改查)
2017/09/04 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
Python实现基于SVM的分类器的方法
2019/07/19 Python
python自动化UI工具发送QQ消息的实例
2019/08/27 Python
python性能测量工具cProfile使用解析
2019/09/26 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
Roxy俄罗斯官方网站:冲浪和滑雪板的一切
2020/06/20 全球购物
上班看电影检讨书
2014/02/12 职场文书
教师个人自我评价范文
2014/04/13 职场文书
监督检查工作方案
2014/05/28 职场文书