首页 > 语言 > PHP > 正文

php文件在线压缩程序类

2024-09-04 11:44:10
字体:
来源:转载
供稿:网友

提供一款超完美的php文件在线压缩程序,原理很简单就是把文件以二进制形式保存了,以前用过利用rar的内核程序,这是php自带的压缩功能,实例代码如下:

  1. set_time_limit(0); 
  2. class phpzip{ 
  3.  
  4.     var $file_count = 0 ; 
  5.     var $datastr_len   = 0; 
  6.     var $dirstr_len = 0; 
  7.     var $filedata = ''//该变量只被类外部程序访问 
  8.     var $gzfilename
  9.     var $fp
  10.     var $dirstr=''
  11.  
  12.     /* 
  13.     返回文件的修改时间格式. 
  14.     只为本类内部函数调用. 
  15.     */ 
  16.     function unix2dostime($unixtime = 0) { 
  17.         $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime); 
  18.  
  19.         if ($timearray['year'] < 1980) { 
  20.         $timearray['year']    = 1980; 
  21.         $timearray['mon']     = 1; 
  22.         $timearray['mday']    = 1; 
  23.         $timearray['hours']   = 0; 
  24.         $timearray['minutes'] = 0; 
  25.         $timearray['seconds'] = 0; 
  26.         } 
  27.  
  28.         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) | 
  29.                ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1); 
  30.     } 
  31.     /* 
  32.     初始化文件,建立文件目录, 
  33.     并返回文件的写入权限. 
  34.     */ 
  35.     function startfile($path = 'faisun.zip'){ 
  36.        $this->gzfilename=$path
  37.        $mypathdir=array(); 
  38.        do
  39.         $mypathdir[] = $path = dirname($path); 
  40.        }while($path != '.'); 
  41.        @end($mypathdir); 
  42.        do
  43.         $path = @current($mypathdir); 
  44.         @mkdir($path); 
  45.        }while(@prev($mypathdir)); 
  46.  
  47.        if($this->fp=@fopen($this->gzfilename,"w")){ 
  48.         return true; 
  49.        } 
  50.        return false; 
  51.     } 
  52.     /* 
  53.     添加一个文件到 zip 压缩包中. 
  54.     */ 
  55.     
  56. function addfile($data$name){ 
  57.         $name     = str_replace('/', '/', $name); 
  58.  
  59.     if(strrchr($name,'/')=='/'return $this->adddir($name); 
  60.  
  61.         $dtime    = dechex($this->unix2dostime()); 
  62.         $hexdtime = 'x' . $dtime[6] . $dtime[7] 
  63.                   . 'x' . $dtime[4] . $dtime[5] 
  64.                   . 'x' . $dtime[2] . $dtime[3] 
  65.                   . 'x' . $dtime[0] . $dtime[1]; 
  66.         eval('$hexdtime = "' . $hexdtime . '";'); 
  67.  
  68.         $unc_len = strlen($data); 
  69.         $crc     = crc32($data); 
  70.         $zdata   = gzcompress($data); 
  71.         $c_len   = strlen($zdata); 
  72.         $zdata   = substr(substr($zdata, 0, strlen($zdata) - 4), 2); 
  73.  
  74.     //新添文件内容格式化: 
  75.         $datastr = "PK"
  76.         $datastr .= "";            // ver needed to extract 
  77.         $datastr .= "";            // gen purpose bit flag 
  78.         $datastr .= "";            // compression method 
  79.         $datastr .= $hexdtime;             // last mod time and date 
  80.         $datastr .= pack('v'$crc);             // crc32 
  81.         $datastr .= pack('v'$c_len);           // compressed filesize 
  82.         $datastr .= pack('v'$unc_len);         // uncompressed filesize 
  83.         $datastr .= pack('v'strlen($name));    // length of filename 
  84.         $datastr .= pack('v', 0);                // extra field length 
  85.         $datastr .= $name
  86.         $datastr .= $zdata
  87.         $datastr .= pack('v'$crc);                 // crc32 
  88.         $datastr .= pack('v'$c_len);               // compressed filesize 
  89.         $datastr .= pack('v'$unc_len);             // uncompressed filesize 
  90.  
  91.  
  92.     fwrite($this->fp,$datastr); //写入新的文件内容 
  93.     $my_datastr_len = strlen($datastr); 
  94.     unset($datastr); 
  95.  
  96.     //新添文件目录信息 
  97.         $dirstr = "PK"
  98.         $dirstr .= "";                // version made by 
  99.         $dirstr .= "";                // version needed to extract 
  100.         $dirstr .= "";                // gen purpose bit flag 
  101.         $dirstr .= "";                // compression method 
  102.         $dirstr .= $hexdtime;                 // last mod time & date 
  103.         $dirstr .= pack('v'$crc);           // crc32 
  104.         $dirstr .= pack('v'$c_len);         // compressed filesize 
  105.         $dirstr .= pack('v'$unc_len);       // uncompressed filesize 
  106.         $dirstr .= pack('v'strlen($name) ); // length of filename 
  107.         $dirstr .= pack('v', 0 );             // extra field length 
  108.         $dirstr .= pack('v', 0 );             // file comment length 
  109.         $dirstr .= pack('v', 0 );             // disk number start 
  110.         $dirstr .= pack('v', 0 );             // internal file attributes 
  111.         $dirstr .= pack('v', 32 );            // external file attributes - 'archive' bit set 
  112.         $dirstr .= pack('v',$this->datastr_len ); // relative offset of local header 
  113.         $dirstr .= $name
  114.  
  115.     $this->dirstr .= $dirstr//目录信息 
  116.  
  117.     $this -> file_count ++; 
  118.     $this -> dirstr_len += strlen($dirstr); 
  119.     $this -> datastr_len += $my_datastr_len
  120.     } 
  121.  
  122.     function adddir($name){ 
  123.        $name = str_replace("/", "/", $name); 
  124.        $datastr = "PK "
  125.  
  126.        $datastr .= pack("v",0).pack("v",0).pack("v",0).pack("v"strlen($name) ); 
  127.        $datastr .= pack("v", 0 ).$name.pack("v", 0).pack("v", 0).pack("v", 0); 
  128.  
  129.        fwrite($this->fp,$datastr); //写入新的文件内容 
  130.        $my_datastr_len = strlen($datastr); 
  131.        unset($datastr); 
  132.  
  133.        $dirstr = "PK "
  134.        $dirstr .= pack("v",0).pack("v",0).pack("v",0).pack("v"strlen($name) ); 
  135.        $dirstr .= pack("v", 0 ).pack("v", 0 ).pack("v", 0 ).pack("v", 0 ); 
  136.        $dirstr .= pack("v", 16 ).pack("v",$this->datastr_len).$name
  137.  
  138.        $this->dirstr .= $dirstr//目录信息 
  139.  
  140.        $this -> file_count ++; 
  141.        $this -> dirstr_len += strlen($dirstr); 
  142.        $this -> datastr_len += $my_datastr_len
  143.     }//开源代码Vevb.com 
  144.     function createfile(){ 
  145.        //压缩包结束信息,包括文件总数,目录信息读取指针位置等信息 
  146.        $endstr = "PK" . 
  147.           pack('v'$this -> file_count) . 
  148.           pack('v'$this -> file_count) . 
  149.           pack('v'$this -> dirstr_len) . 
  150.           pack('v'$this -> datastr_len) . 
  151.           ""
  152.  
  153.        fwrite($this->fp,$this->dirstr.$endstr); 
  154.        fclose($this->fp); 
  155.     } 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表