php文件压缩之PHPZip类用法实例

5年以前  |  阅读数:842 次  |  编程语言:PHP 

本文实例讲述了php文件压缩之PHPZip类用法。分享给大家供大家参考。具体如下:


    <?php
    //
    // PHPZip v1.2 by Sext (sext@neud.net) 
    //
    // 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]
            . '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, 0, 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
    ?>

使用方法:


    <?php
    $z = new PHPZip(); //新建立一个zip的类
    //方法一:
    $z -> Zip("", "out1.zip"); //添加当前目录和子目录下的所有档案
    //方法二:
    $files=array('1.txt','gb.txt');
    $files[]='5.txt';
    $z -> Zip($files, "out2.zip"); //添加文件列表
    //方法三:
    $z -> Zip("/usr/local/sext/", "out3.zip"); //添加指定目录
    ?>

希望本文所述对大家的php程序设计有所帮助。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
获取IMEI
文件下载
贪吃蛇
双位运算符
PHP自定义函数获取搜索引擎来源关键字的方法
Java生成UUID
发送邮件
年的日历图
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
Yii2汉字转拼音类的实例代码
再谈PHP中单双引号的区别详解
指定应用ID以获取对应的应用名称
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例