当前位置:首页 > PHP教程 > php类库 > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-05-28 21:39:56 浏览: 评论:0 

这篇文章主要介绍了php文件压缩之PHPZip类用法,实例分析了PHPZip类的定义与相关使用技巧,需要的朋友可以参考下。

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

  1. <?php 
  2. // 
  3. // PHPZip v1.2 by Sext (sext@neud.net)  
  4. // 
  5. // Makes zip archive 
  6. // 
  7. // Based on "Zip file creation class", uses zLib 
  8. // 
  9. // 
  10. class PHPZip 
  11. function Zip($dir$zipfilename
  12.     if (@function_exists('gzcompress')) 
  13.     { 
  14.      $curdir = getcwd(); 
  15.      if (is_array($dir)) 
  16.      { 
  17.           $filelist = $dir
  18.      } 
  19.      else 
  20.      { 
  21.       $filelist = $this -> GetFileList($dir); 
  22.      } 
  23.      if ((!emptyempty($dir))&&(!is_array($dir))&&(file_exists($dir))) chdir($dir); 
  24.      else chdir($curdir); 
  25.      if (count($filelist)>0) 
  26.      { 
  27.       foreach($filelist as $filename
  28.       { 
  29.           if (is_file($filename)) 
  30.           { 
  31.            $fd = fopen ($filename"r"); 
  32.            $content = fread ($fdfilesize ($filename)); 
  33.            fclose ($fd); 
  34.            if (is_array($dir)) $filename = basename($filename); 
  35.            $this -> addFile($content$filename); 
  36.           } 
  37.       } 
  38.       $out = $this -> file(); 
  39.       chdir($curdir); 
  40.       $fp = fopen($zipfilename"w"); 
  41.       fwrite($fp$outstrlen($out)); 
  42.       fclose($fp); 
  43.      } 
  44.      return 1; 
  45.     } 
  46.     else return 0; 
  47. function GetFileList($dir
  48.     if (file_exists($dir)) 
  49.     { 
  50.      $args = func_get_args(); 
  51.      $pref = $args[1]; 
  52.      $dh = opendir($dir); 
  53.      while($files = readdir($dh)) 
  54.      { 
  55.       if (($files!=".")&&($files!="..")) 
  56.       { 
  57.           if (is_dir($dir.$files)) 
  58.           { 
  59.            $curdir = getcwd(); 
  60.            chdir($dir.$files); 
  61.            $file = array_merge($file$this -> GetFileList("""$pref$files/")); 
  62.            chdir($curdir); 
  63.           } 
  64.           else $file[]=$pref.$files
  65.       } 
  66.      } 
  67.      closedir($dh); 
  68.     } 
  69.     return $file
  70. var $datasec  = array(); 
  71. var $ctrl_dir   = array(); 
  72. var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00"
  73. var $old_offset = 0; 
  74. /** 
  75.   * Converts an Unix timestamp to a four byte DOS date and time format (date 
  76.   * in high two bytes, time in low two bytes allowing magnitude comparison). 
  77.   * 
  78.   * @param  integer  the current Unix timestamp 
  79.   * 
  80.   * @return integer  the current date in a four byte DOS format 
  81.   * 
  82.   * @access private 
  83.   */ 
  84. function unix2DosTime($unixtime = 0) { 
  85.     $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); 
  86.     if ($timearray['year'] < 1980) { 
  87.      $timearray['year'] = 1980; 
  88.      $timearray['mon']   = 1; 
  89.      $timearray['mday'] = 1; 
  90.      $timearray['hours'] = 0; 
  91.      $timearray['minutes'] = 0; 
  92.      $timearray['seconds'] = 0; 
  93.     } // end if 
  94.     return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | 
  95.       ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); 
  96. // end of the 'unix2DosTime()' method 
  97. /** 
  98.   * Adds "file" to archive 
  99.   * 
  100.   * @param  string file contents 
  101.   * @param  string name of the file in the archive (may contains the path) 
  102.   * @param  integer  the current timestamp 
  103.   * 
  104.   * @access public 
  105.   */ 
  106. function addFile($data$name$time = 0) 
  107.     $name   = str_replace('''/'$name); 
  108.    
  109.     $dtime = dechex($this->unix2DosTime($time)); 
  110.     $hexdtime = 'x' . $dtime[6] . $dtime[7] 
  111.         . 'x' . $dtime[4] . $dtime[5] 
  112.         . 'x' . $dtime[2] . $dtime[3] 
  113.         . 'x' . $dtime[0] . $dtime[1]; 
  114.     eval('$hexdtime = "' . $hexdtime . '";'); 
  115.     $fr = "x50x4bx03x04"
  116.     $fr .= "x14x00";     // ver needed to extract 
  117.     $fr .= "x00x00";     // gen purpose bit flag 
  118.     $fr .= "x08x00";     // compression method 
  119.     $fr .= $hexdtime;     // last mod time and date 
  120.    
  121.     // "local file header" segment 
  122.     $unc_len = strlen($data); 
  123.     $crc   = crc32($data); 
  124.     $zdata = gzcompress($data); 
  125.     $c_len = strlen($zdata); 
  126.     $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug 
  127.     $fr  .= pack('V'$crc);     // crc32 
  128.     $fr  .= pack('V'$c_len);      // compressed filesize 
  129.     $fr  .= pack('V'$unc_len);    // uncompressed filesize 
  130.     $fr  .= pack('v'strlen($name)); // length of filename 
  131.     $fr  .= pack('v', 0);       // extra field length 
  132.     $fr  .= $name
  133.     // "file data" segment 
  134.     $fr .= $zdata
  135.     // "data descriptor" segment (optional but necessary if archive is not 
  136.     // served as file) 
  137.     $fr .= pack('V'$crc);         // crc32 
  138.     $fr .= pack('V'$c_len);       // compressed filesize 
  139.     $fr .= pack('V'$unc_len);     // uncompressed filesize 
  140.     // add this entry to array 
  141.     $this -> datasec[] = $fr
  142.     $new_offset    = strlen(implode(''$this->datasec)); 
  143.     // now add to central directory record 
  144.     $cdrec = "x50x4bx01x02"
  145.     $cdrec .= "x00x00";       // version made by 
  146.     $cdrec .= "x14x00";       // version needed to extract 
  147.     $cdrec .= "x00x00";       // gen purpose bit flag 
  148.     $cdrec .= "x08x00";       // compression method 
  149.     $cdrec .= $hexdtime;         // last mod time & date 
  150.     $cdrec .= pack('V'$crc);      // crc32 
  151.     $cdrec .= pack('V'$c_len);    // compressed filesize 
  152.     $cdrec .= pack('V'$unc_len);  // uncompressed filesize 
  153.     $cdrec .= pack('v'strlen($name) ); // length of filename 
  154.     $cdrec .= pack('v', 0 );     // extra field length 
  155.     $cdrec .= pack('v', 0 );     // file comment length 
  156.     $cdrec .= pack('v', 0 );     // disk number start 
  157.     $cdrec .= pack('v', 0 );     // internal file attributes 
  158.     $cdrec .= pack('V', 32 );     // external file attributes - 'archive' bit set 
  159.     $cdrec .= pack('V'$this -> old_offset ); // relative offset of local header 
  160.     $this -> old_offset = $new_offset
  161.     $cdrec .= $name
  162.     // optional extra field, file comment goes here 
  163.     // save to central directory 
  164.     $this -> ctrl_dir[] = $cdrec
  165. // end of the 'addFile()' method 
  166. /** 
  167.   * Dumps out file 
  168.   * 
  169.   * @return  string  the zipped file 
  170.   * 
  171.   * @access public 
  172.   */ 
  173. function file() 
  174.     $data = implode(''$this -> datasec); 
  175.     $ctrldir = implode(''$this -> ctrl_dir); 
  176.    
  177.     return 
  178.      $data . 
  179.      $ctrldir . 
  180.      $this -> eof_ctrl_dir . 
  181.      pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries "on this disk" 
  182.      pack('v', sizeof($this -> ctrl_dir)) .  // total # of entries overall 
  183.      pack('V'strlen($ctrldir)) .      // size of central dir 
  184.      pack('V'strlen($data)) .       // offset to start of central dir 
  185.      "x00x00";               // .zip file comment length 
  186. // end of the 'file()' method 
  187. // end of the 'PHPZip' class 
  188. ?> 

使用方法:

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

Tags: php文件压缩 PHPZip

分享到:

相关文章