`

php中zip压缩包的操作类

 
阅读更多
<?php
/**
 * Zip 文件包工具
 * 
 * @author wengxianhu
 * @date 2013-08-05
 */

class ZipFolder
{
    protected $zip;
    protected $root;
    protected $ignored_names;

    public function __construct(){
        $this->zip = new ZipArchive;
    }

    /**
     * 解压zip文件到指定文件夹
     *
     * @access public
     * @param string $zipfile 压缩文件路径
     * @param string $path    压缩包解压到的目标路径
     * @return booleam 解压成功返回 true 否则返回 false
    */
    public function unzip ($zipfile, $path) {
        if ($this->zip->open($zipfile) === true) {
            $file_tmp = @fopen($zipfile, "rb");
            $bin = fread($file_tmp, 15); //只读15字节 各个不同文件类型,头信息不一样。
            fclose($file_tmp);
            /* 只针对zip的压缩包进行处理 */
            if (true === $this->getTypeList($bin))
            {
                $result = $this->zip->extractTo($path);
                $this->zip->close();
                return $result;
            }
            else
            {
                return false;
            }
        }
        return false;
    }

    /**
     * 创建压缩文件
     *
     * @access public
     * @param string $zipfile 将要生成的压缩文件路径
     * @param strng  $folder  将要被压缩的文件夹路径
     * @param array  $ignored 要忽略的文件列表
     * @return booleam 压缩包生成成功返回true 否则返回 false
    */
     public function zip ($zipfile, $folder, $ignored = null) {
        $this->ignored_names = is_array($ignored) ? $ignored : $ignored ? array($ignored) : array();
        if ($this->zip->open($zipfile, ZIPARCHIVE::CREATE) !== true) {
            throw new Exception("cannot open <$zipfile>\n");
        }
        $folder = substr($folder, -1) == '/' ? substr($folder, 0, strlen($folder)-1) : $folder;
        if(strstr($folder, '/')) {
            $this->root = substr($folder, 0, strrpos($folder, '/')+1);
            $folder = substr($folder, strrpos($folder, '/')+1);
        }
        $this->createZip($folder);
        return $this->zip->close();
    }

    /**
     * 递归添加文件到压缩包
     *
     * @access private
     * @param string $folder 添加到压缩包的文件夹路径
     * @param string $parent 添加到压缩包的文件夹上级路径
     * @return void
    */
    private function createZip ($folder, $parent=null) {
        $full_path = $this->root . $parent . $folder;
        $zip_path = $parent . $folder;
        $this->zip->addEmptyDir($zip_path);

        $dir = new DirectoryIterator($full_path);

        foreach($dir as $file) {
            if(!$file->isDot()) {
                $filename = $file->getFilename();

                if(!in_array($filename, $this->ignored_names)) {
                    if($file->isDir()) {
                        $this->createZip($filename, $zip_path.'/');
                    }else {
                        $this->zip->addFile($full_path.'/'.$filename, $zip_path.'/'.$filename);
                    }
                }
            }
        }
    }

    /**
     * 读取压缩包文件与目录列表
     *
     * @access public
     * @param string $zipfile 压缩包文件
     * @return array 文件与目录列表
    */
    public function fileList($zipfile) {
        $file_dir_list = array();
        $file_list = array();

        if ($this->zip->open($zipfile) == true) {
            for ($i = 0; $i < $this->zip->numFiles; $i++) {
                $numfiles = $this->zip->getNameIndex($i);
                if (preg_match('/\/$/i', $numfiles))
                {
                    $file_dir_list[] = $numfiles;
                }
                else
                {
                    $file_list[] = $numfiles;
                }
            }
        }

        return array('files'=>$file_list, 'dirs'=>$file_dir_list);
    }

    /**
    * 得到文件头与文件类型映射表
    *
    * @author wengxianhu
    * @date 2013-08-10
    * @param $bin string 文件的二进制前一段字符
    * @return boolean
    */
    private function getTypeList ($bin)
    {
        $array = array(
            array("504B0304", "zip")
        );

        foreach ($array as $v)
        {
            $blen = strlen(pack("H*", $v[0])); //得到文件头标记字节数
            $tbin = substr($bin, 0, intval($blen)); ///需要比较文件头长度
            if(strtolower($v[0]) == strtolower(array_shift(unpack("H*", $tbin))))
            {
                return true;
            }
        }
        return false;
    }
}

分享到:
评论

相关推荐

    PHP Zip压缩包、压缩操作类

    PHP Zip压缩包、压缩操作类,操作文件的压缩和解压

    PHP zip压缩包操作类完整实例

    ### PHP zip压缩包操作类知识点详解 #### PHP ZipArchive类简介 PHP内置了`ZipArchive`类,它提供了一系列方法来处理ZIP压缩包。通过这个类,PHP能够创建新的zip文件,添加文件到zip中,读取zip文件中的内容,以及...

    php中mysql数据库操作类.zip

    在这个“php中mysql数据库操作类.zip”压缩包中,很可能包含了一个基于MySQLi或PDO实现的自定义数据库操作类。 一个基础的PHP MySQL数据库操作类通常包括以下组件: 1. **连接函数**:用于建立与MySQL服务器的连接...

    PHP远程文件下载解压压缩包.zip文件file文件操作类

    2. **解压ZIP文件**:PHP的`ZipArchive`类提供了对ZIP文件的读取和操作。首先,打开ZIP文件,然后遍历每个条目并提取到目标目录。 ```php function extractZip($zipFilePath, $destinationDir) { $zip = new Zip...

    php生成zip压缩文件

    例如,可以使用`shell_exec()`函数调用系统命令(如`zip`命令行工具)来创建ZIP,或者使用第三方库如PHPZip(https://github.com/Spipu/PhpZip)来提供更多高级功能,如支持读取流、加密等。 总的来说,PHP生成ZIP...

    php ftp操作类.zip

    这个"php ftp操作类.zip"文件提供了一个专为PHP设计的FTP操作类,使得开发者能够更方便地执行这些操作。下面我们将详细探讨FTP操作类的基本概念、常用方法以及如何使用此类。 FTP操作类是将FTP相关的功能封装在一起...

    php实现的加密解密处理类.zip

    这个“php实现的加密解密处理类”压缩包文件提供了一个专门用于加密和解密操作的PHP类库,使得开发人员能够更方便、安全地处理这些关键信息。下面将详细探讨相关的知识点。 首先,我们来了解一下加密的基本概念。...

    php文件目录操作类.zip

    这个“php文件目录操作类”压缩包提供了一个实用的工具,帮助开发者更方便地处理这些任务。下面我们将深入探讨这个类的一些核心功能以及相关的PHP文件系统函数。 首先,类库的核心功能包括: 1. 建立文件夹:在PHP...

    php的数组操作类.zip

    在这个案例中,我们有一个名为"php的数组操作类"的压缩包,它提供了一些实用方法,帮助我们更有效地对数组进行操作。下面将详细介绍这些功能及其相关知识点。 首先,该类包含了一个方法,用于从数组中删除空白元素...

    php连接mysql数据库操作类.zip

    标题提到的"php连接mysql数据库操作类.zip"是一个压缩包,其中包含了一个PHP类,专门用于处理与MySQL数据库的交互,如查询、更新、删除等常见操作。这个类库可能是为了简化数据库操作,提高代码的可读性和可维护性而...

    phpmailer.zip php发送邮件类 支持附件

    这个压缩包`phpmailer.zip`包含了使用`phpMailer`所需的主要文件。 1. **phpmailer_doc.html**: 这个文件是`phpMailer`的文档,提供了类库的详细使用说明和API参考。通过阅读这份文档,开发者可以了解到如何初始...

    PHP多个图片压缩成ZIP(兼容中文文件名)

    在PHP中,将多个图片压缩成ZIP文件是一个常见的任务,特别是在网站开发中处理用户上传的图片时。这个过程涉及到文件操作、编码处理以及利用PHP...通过熟练运用这些技巧,我们可以创建出一个兼容中文文件名的ZIP压缩包。

    archive_ php+mysql数据库操作类 v1.0 [江西新余电信].zip.zip

    标题中的"archive_php+mysql数据库操作类 v1.0 [江西新余电信].zip.zip"表明这是一个关于PHP和MySQL数据库操作的类库,版本为1.0,且可能由江西新余电信的相关开发者或团队创建。这个压缩包可能是用于帮助开发者更...

    PHP生成、下载excel、zip压缩文件_excelphp图片_excel_zip_php_

    PHP内置了`ZipArchive`类,可以方便地进行文件和目录的压缩操作: 1. **创建ZipArchive实例**:`$zip = new ZipArchive();` 2. **打开或创建ZIP文件**:使用`open`方法打开现有的ZIP文件或创建新的,例如`$zip-&gt;...

    Apache和PHP压缩包,解压配置可用

    在压缩包中的 `apache http serve64.zip` 文件是适用于 64 位操作系统的 Apache 安装包。解压后,你需要找到 `httpd.conf` 并根据你的需求进行基本配置。例如,将 `DocumentRoot` 指向你的网站内容目录,确保 Apache...

    PHP给图片添加水印,压缩,剪切的封装类.zipzip

    php对图片文件的操作主要是利用GD库扩展。当我们频繁利用php对图片进行操作时,会自然封装很多函数,否则会写太多重复的代码。当有很多对图片的相关函数的时候,我们可以考虑将这些函数也整理一下,因而就有了封装成...

    php在线压缩代码zip

    以下是一个简单的示例,展示了如何使用PHP创建一个包含网站文件的ZIP压缩包: ```php &lt;?php $zip = new ZipArchive(); $filename = "website_backup.zip"; if ($zip-&gt;open($filename, ZipArchive::CREATE) === TRUE...

    TbsZip(PHP 的压缩包处理类) v2.16.zip

    TbsZip是一个 PHP 的类用来读写 Zip 压缩文件包,该类无需 PHP 扩展或者是临时文件。TbsZip 可以对压缩文档中的文件进行读、写、修改和删除操作。详细使用方法请看这里。    相关阅读 同类推荐:站长常用源码

    index.php_QQ浏览器压缩包.zip

    标题中的“index.php_QQ浏览器压缩包.zip”表明这是一个与Web开发相关的压缩文件,特别是与PHP语言和QQ浏览器有关。由于“index.php”是Web服务器上默认的首页文件,我们可推断这个压缩包可能包含了一个网站的入口...

Global site tag (gtag.js) - Google Analytics