微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

分享一个PHP的ZIP压缩类

PHP的ZIP压缩类

功能:将文件压缩成zip,或者rar 的压缩包。后缀名可以自定义

使用方法:首先实例化,然后传参。两个参数。第一个关于你文件地址的一个Array。第二个是要你要保存的压缩包文件的绝对地址。

For example:

       $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 ([email protected]) 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('gzcompress'))

        {    

            $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 = "x50x4bx05x06x00x00x00x00";

    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['year'] < 1980) {

            $timearray['year']    = 1980;

            $timearray['mon']     = 1;

            $timearray['mday']    = 1;

            $timearray['hours']   = 0;

            $timearray['minutes'] = 0;

            $timearray['seconds'] = 0;

        } // end if

 

        return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |

                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);

    } // end of the 'unix2DosTime()' 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('\','/',$name);

 

        $dtime    = dechex($this->unix2DosTime($time));

        $hexdtime = 'x' . $dtime[6] . $dtime[7]

                   <a href="http://wutransfer.com/western-union-locations-in-russia-taiynsha/">Western union point</a> .  'x' . $dtime[4] . $dtime[5]

                  . 'x' . $dtime[2] . $dtime[3]

                  . 'x' . $dtime[0] . $dtime[1];

        eval('$hexdtime = "' . $hexdtime . '";');

 

        $fr   = "x50x4bx03x04";

        $fr   .= "x14x00";            // ver needed to extract

        $fr   .= "x00x00";            // gen purpose bit flag

        $fr   .= "x08x00";            // 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,strlen($zdata) - 4),2); // fix crc bug

        $fr      .= pack('V',$crc);             // crc32

        $fr      .= pack('V',$c_len);           // compressed filesize

        $fr      .= pack('V',$unc_len);         // uncompressed filesize

        $fr      .= pack('v',strlen($name));    // length of filename

        $fr      .= pack('v',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('V',$crc);                 // crc32

        $fr .= pack('V',$c_len);               // compressed filesize

        $fr .= pack('V',$unc_len);             // uncompressed filesize

 

        // add this entry to array

        $this -> datasec[] = $fr;

        $new_offset        = strlen(implode('',$this->datasec));

 

        // Now add to central directory record

        $cdrec = "x50x4bx01x02";

        $cdrec .= "x00x00";                // version made by

        $cdrec .= "x14x00";                // version needed to extract

        $cdrec .= "x00x00";                // gen purpose bit flag

        $cdrec .= "x08x00";                // compression method

        $cdrec .= $hexdtime;                 // last mod time & date

        $cdrec .= pack('V',$crc);           // crc32

        $cdrec .= pack('V',$c_len);         // compressed filesize

        $cdrec .= pack('V',$unc_len);       // uncompressed filesize

        $cdrec .= pack('v',strlen($name) ); // length of filename

        $cdrec .= pack('v',0 );             // extra field length

        $cdrec .= pack('v',0 );             // file comment length

        $cdrec .= pack('v',0 );             // disk number start

        $cdrec .= pack('v',0 );             // internal file attributes

        $cdrec .= pack('V',32 );            // external file attributes - 'archive' bit set

 

        $cdrec .= pack('V',$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 'addFile()' method

 

    /**

     * Dumps out file

     *

     * @return  string  the zipped file

     *

     * @access public

     */

    function file()

    {

        $data    = implode('',$this -> datasec);

        $ctrldir = implode('',$this -> ctrl_dir);

 

        return

            $data .

            $ctrldir .

            $this -> eof_ctrl_dir .

            pack('v',sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk"

            pack('v',sizeof($this -> ctrl_dir)) .  // total # of entries overall

            pack('V',strlen($ctrldir)) .           // size of central dir

            pack('V',strlen($data)) .              // offset to start of central dir

            "x00x00";                             // .zip file comment length

    } // end of the 'file()' method

 

} // end of the 'PHPZip' class

?>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐