Home >Backend Development >PHP Tutorial >Detailed explanation of steps for php ZIP compression class example

Detailed explanation of steps for php ZIP compression class example

php中世界最好的语言
php中世界最好的语言Original
2018-05-21 11:17:451977browse

这次给大家带来php ZIP压缩类实例步骤详解,php ZIP压缩类使用的注意事项有哪些,下面就是实战案例,一起来看一下。

功能:将文件压缩成zip,或者rar的压缩包。后缀名可以自定义。
使用方法:首先实例化,然后传参。两个参数。
第一个关于文件地址的一个Array。
第二个是要保存的压缩包文件的绝对地址。

php zip压缩类的调用方法:

<?php
$zipfiles =array("/root/pooy/test1.txt","/root/pooy/test2.txt");
$z = new PHPZip();
//$randomstr = random(8);
$zipfile = TEMP."/photocome_".$groupid.".zip";
$z->Zip($zipfiles, $zipfile); //添加文件列表

PHP的ZIP压缩类

<?php
# 
# PHPZip v1.2 by Sext (sext@neud.net) 2002-11-18
#     (Changed: 2003-03-01)
# 
# Makes zip archive
#
# Based on "Zip file creation class", uses zLib
#
#
class PHPZip
{
    function Zip($dir, $zipfilename)
    {
        if (@function_exists(&#39;gzcompress&#39;))
        {    
            $curdir = getcwd();
            if (is_array($dir)) 
            {
                    $filelist = $dir;
            }
            else
            {
                $filelist = $this -> GetFileList($dir);
            }
            if ((!empty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir);
            else chdir($curdir);
            if (count($filelist)>0)
            {
                foreach($filelist as $filename)
                {
                    if (is_file($filename))
                    {
                        $fd = fopen ($filename, "r");
                        $content = fread ($fd, filesize ($filename));
                        fclose ($fd);
                        if (is_array($dir)) $filename = basename($filename);
                        $this -> addFile($content, $filename);
                    }
                }
                $out = $this -> file();
                chdir($curdir);
                $fp = fopen($zipfilename, "w");
                fwrite($fp, $out, strlen($out));
                fclose($fp);
            }
            return 1;
        } 
        else return 0;
    }
    function GetFileList($dir)
    {
        if (file_exists($dir))
        {
            $args = func_get_args();
            $pref = $args[1];
            $dh = opendir($dir);
            while($files = readdir($dh))
            {
                if (($files!=".")&&($files!="..")) 
                {
                    if (is_dir($dir.$files)) 
                    {
                        $curdir = getcwd();
                        chdir($dir.$files);
                        $file = array_merge($file, $this -> GetFileList("", "$pref$files/"));
                        chdir($curdir);
                    }
                    else $file[]=$pref.$files;
                }
            }
            closedir($dh);
        }
        return $file;
    }
    var $datasec      = array();
    var $ctrl_dir     = array();
    var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
    var $old_offset   = 0;
    /**
     * Converts an Unix timestamp to a four byte DOS date and time format (date
     * in high two bytes, time in low two bytes allowing magnitude comparison).
     *
     * @param  integer  the current Unix timestamp
     *
     * @return integer  the current date in a four byte DOS format
     *
     * @access private
     */
    function unix2DosTime($unixtime = 0) {
        $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);
        if ($timearray[&#39;year&#39;] < 1980) {
            $timearray[&#39;year&#39;]    = 1980;
            $timearray[&#39;mon&#39;]     = 1;
            $timearray[&#39;mday&#39;]    = 1;
            $timearray[&#39;hours&#39;]   = 0;
            $timearray[&#39;minutes&#39;] = 0;
            $timearray[&#39;seconds&#39;] = 0;
        } // end if
        return (($timearray[&#39;year&#39;] - 1980) << 25) | ($timearray[&#39;mon&#39;] << 21) | ($timearray[&#39;mday&#39;] << 16) |
                ($timearray[&#39;hours&#39;] << 11) | ($timearray[&#39;minutes&#39;] << 5) | ($timearray[&#39;seconds&#39;] >> 1);
    } // end of the &#39;unix2DosTime()&#39; method
    /**
     * Adds "file" to archive
     *
     * @param  string   file contents
     * @param  string   name of the file in the archive (may contains the path)
     * @param  integer  the current timestamp
     *
     * @access public
     */
    function addFile($data, $name, $time = 0)
    {
        $name     = str_replace(&#39;\\&#39;, &#39;/&#39;, $name);
        $dtime    = dechex($this->unix2DosTime($time));
        $hexdtime = &#39;\x&#39; . $dtime[6] . $dtime[7]
                   <a href="http://wutransfer.com/western-union-locations-in-russia-taiynsha/">Western union point</a> .  &#39;\x&#39; . $dtime[4] . $dtime[5]
                  . &#39;\x&#39; . $dtime[2] . $dtime[3]
                  . &#39;\x&#39; . $dtime[0] . $dtime[1];
        eval(&#39;$hexdtime = "&#39; . $hexdtime . &#39;";&#39;);
        $fr   = "\x50\x4b\x03\x04";
        $fr   .= "\x14\x00";            // ver needed to extract
        $fr   .= "\x00\x00";            // gen purpose bit flag
        $fr   .= "\x08\x00";            // compression method
        $fr   .= $hexdtime;             // last mod time and date
        // "local file header" segment
        $unc_len = strlen($data);
        $crc     = crc32($data);
        $zdata   = gzcompress($data);
        $c_len   = strlen($zdata);
        $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug
        $fr      .= pack(&#39;V&#39;, $crc);             // crc32
        $fr      .= pack(&#39;V&#39;, $c_len);           // compressed filesize
        $fr      .= pack(&#39;V&#39;, $unc_len);         // uncompressed filesize
        $fr      .= pack(&#39;v&#39;, strlen($name));    // length of filename
        $fr      .= pack(&#39;v&#39;, 0);                // extra field length
        $fr      .= $name;
        // "file data" segment
        $fr .= $zdata;
        // "data descriptor" segment (optional but necessary if archive is not
        // served as file)
        $fr .= pack(&#39;V&#39;, $crc);                 // crc32
        $fr .= pack(&#39;V&#39;, $c_len);               // compressed filesize
        $fr .= pack(&#39;V&#39;, $unc_len);             // uncompressed filesize
        // add this entry to array
        $this -> datasec[] = $fr;
        $new_offset        = strlen(implode(&#39;&#39;, $this->datasec));
        // now add to central directory record
        $cdrec = "\x50\x4b\x01\x02";
        $cdrec .= "\x00\x00";                // version made by
        $cdrec .= "\x14\x00";                // version needed to extract
        $cdrec .= "\x00\x00";                // gen purpose bit flag
        $cdrec .= "\x08\x00";                // compression method
        $cdrec .= $hexdtime;                 // last mod time & date
        $cdrec .= pack(&#39;V&#39;, $crc);           // crc32
        $cdrec .= pack(&#39;V&#39;, $c_len);         // compressed filesize
        $cdrec .= pack(&#39;V&#39;, $unc_len);       // uncompressed filesize
        $cdrec .= pack(&#39;v&#39;, strlen($name) ); // length of filename
        $cdrec .= pack(&#39;v&#39;, 0 );             // extra field length
        $cdrec .= pack(&#39;v&#39;, 0 );             // file comment length
        $cdrec .= pack(&#39;v&#39;, 0 );             // disk number start
        $cdrec .= pack(&#39;v&#39;, 0 );             // internal file attributes
        $cdrec .= pack(&#39;V&#39;, 32 );            // external file attributes - &#39;archive&#39; bit set
        $cdrec .= pack(&#39;V&#39;, $this -> old_offset ); // relative offset of local header
        $this -> old_offset = $new_offset;
        $cdrec .= $name;
        // optional extra field, file comment goes here
        // save to central directory
        $this -> ctrl_dir[] = $cdrec;
    } // end of the &#39;addFile()&#39; method
    /**
     * Dumps out file
     *
     * @return  string  the zipped file
     *
     * @access public
     */
    function file()
    {
        $data    = implode(&#39;&#39;, $this -> datasec);
        $ctrldir = implode(&#39;&#39;, $this -> ctrl_dir);
        return
            $data .
            $ctrldir .
            $this -> eof_ctrl_dir .
            pack(&#39;v&#39;, sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"
            pack(&#39;v&#39;, sizeof($this -> ctrl_dir)) .  // total # of entries overall
            pack(&#39;V&#39;, strlen($ctrldir)) .           // size of central dir
            pack(&#39;V&#39;, strlen($data)) .              // offset to start of central dir
            "\x00\x00";                             // .zip file comment length
    } // end of the &#39;file()&#39; method
} // end of the &#39;PHPZip&#39; class
?>

老外实现的php zip压缩类,个人感觉还是不错的,里面有大量php实用函数的应用技巧,特别是函数pack、crc32、gzcompress等函数的应用,值得学习借鉴。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

php数组函数shuffle()与array_rand()随机函数使用步骤详解

php判断远程图片能否被调用

The above is the detailed content of Detailed explanation of steps for php ZIP compression class example. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn