Home >php教程 >php手册 >PHP操作Zip

PHP操作Zip

WBOY
WBOYOriginal
2016-06-13 10:50:091521browse

 
     class PHPZip   
 
    {   
 
         private $ctrl_dir     = array();   
 
         private $datasec      = array();   
 
    
   
 
         /**********************************************************  
 
       * ѹ������  
 
        **********************************************************/  
 
        // ------------------------------------------------------ //   
 
         // #����ָ���ļ���   
 
        //   
 
        // $archive  = new PHPZip();   
 
        // $filelist = $archive->visitFile(�ļ���·��);   
 
        // print "��ǰ�ļ��е��ļ�:

\r\n";   
 
       // foreach($filelist as $file)   
 
        //     printf("%s
\r\n", $file);   
 
        // ------------------------------------------------------ //   
 
       var $fileList = array();   
 
        public function visitFile($path)   
 
        {   
 
             global $fileList;   
 
           $path = str_replace("\\", "/", $path);   
 
          $fdir = dir($path);   
 
            
           while(($file = $fdir->read()) !== false)   
          {   
 
              if($file == '.' || $file == '..'){ continue; }   
 
            
 
                $pathSub    = preg_replace("*/{2,}*", "/", $path."/".$file);  // �滻�����б��   
 
                $fileList[] = is_dir($pathSub) ? $pathSub."/" : $pathSub;   
 
            if(is_dir($pathSub)){ $this->visitFile($pathSub); }   
          }   
           $fdir->close();   
 
           return $fileList;   
 
       }   
 
            
 
 
        private function unix2DosTime($unixtime = 0)   
 
        {   
            $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);   
 
       
 
           if($timearray['year']            {   
 
              $timearray['year']    = 1980;   
                $timearray['mon']     = 1;   
                $timearray['mday']    = 1;   
                $timearray['hours']   = 0;   
                $timearray['minutes'] = 0;   
               $timearray['seconds'] = 0;   
            }   
        
            return (  ($timearray['year'] - 1980)  
                   | ($timearray['mon']  
                 | ($timearray['mday']                    | ($timearray['hours']  
                   | ($timearray['minutes']  
                  | ($timearray['seconds'] >> 1);   
 
        }   
 
            
 
            
 
        var $old_offset = 0;   
 
        private function addFile($data, $filename, $time = 0)   
       {   
 
            $filename = str_replace('\\', '/', $filename);   
 
       
 
           $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       = "\x50\x4b\x03\x04";   
 
          $fr      .= "\x14\x00";   
 
          $fr      .= "\x00\x00";   
 
            $fr      .= "\x08\x00";   
 
          $fr      .= $hexdtime;   
 
           $unc_len  = strlen($data);   
 
           $crc      = crc32($data);   
 
          $zdata    = gzcompress($data);   
 
           $c_len    = strlen($zdata);   
 
           $zdata    = substr(substr($zdata, 0, strlen($zdata) - 4), 2);   
 
           $fr      .= pack('V', $crc);   
 
            $fr      .= pack('V', $c_len);   
 
           $fr      .= pack('V', $unc_len);   
 
          $fr      .= pack('v', strlen($filename));   
 
           $fr      .= pack('v', 0);   
 
          $fr      .= $filename;   
 
        
 
           $fr      .= $zdata;   
 
        
 
           $fr      .= pack('V', $crc);   
 
           $fr      .= pack('V', $c_len);   
 
          $fr      .= pack('V', $unc_len);   
 
        
 
            $this->datasec[] = $fr;   
 
            $new_offset      = strlen(implode('', $this->datasec));   
     
 
           $cdrec  = "\x50\x4b\x01\x02";   
 
           $cdrec .= "\x00\x00";   
 
            $cdrec .= "\x14\x00";   
 
           $cdrec .= "\x00\x00";   
 
         $cdrec .= "\x08\x00";   
 
          $cdrec .= $hexdtime;   
 
           $cdrec .= pack('V', $crc);   
 
            $cdrec .= pack('V', $c_len);   
 
            $cdrec .= pack('V', $unc_len);   
 
            $cdrec .= pack('v', strlen($filename) );   
 
           $cdrec .= pack('v', 0 );   
 
          $cdrec .= pack('v', 0 );   
 
           $cdrec .= pack('v', 0 );   
 
         $cdrec .= pack('v', 0 );   
 
           $cdrec .= pack('V', 32 );   
 
      
 
            $cdrec .= pack('V', $this->old_offset );   
 
          $this->old_offset = $new_offset;   
 
       
 
            $cdrec .= $filename;   
 
           $this->ctrl_dir[] = $cdrec;   
 
       }   
 
            
 
            
 
        var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";   
 
        private function file()   
 
         {   
 
             $data    = implode('', $this->datasec);   
 
             $ctrldir = implode('', $this->ctrl_dir);   
        
 
             return   $data  
 
                    . $ctrldir  
 
                  . $this->eof_ctrl_dir   
 
                  . pack('v', sizeof($this->ctrl_dir))   
 
                  . pack('v', sizeof($this->ctrl_dir))   
 
                  . pack('V', strlen($ctrldir))   
 
                  . pack('V', strlen($data))   
 
                  . "\x00\x00";   
 
       }   
 
       
 
           
 
       // ------------------------------------------------------ //   
 
       // #ѹ����������   
 
       //   
 
       // $archive = new PHPZip();   
 
       // $archive->Zip("��ѹ�����ļ�����Ŀ¼", "ZIPѹ���ļ���");    
 
         // ------------------------------------------------------ //   
 
         public function Zip($dir, $saveName)   
 
         {   
 
             if(@!function_exists('gzcompress')){ return; }   
 
         
 
             ob_end_clean();   
 
             $filelist = $this->visitFile($dir);   
 
             if(count($filelist) == 0){ return; }   
 
         
 
             foreach($filelist as $file)   
 
             {   
 
                 if(!file_exists($file) || !is_file($file)){ continue; }   
 
                     
 
                 $fd       = fopen($file, "rb");   
 
                 $content  = @fread($fd, filesize($file));   
 
                 fclose($fd);   
 
     
 
                 // 1.ɾ��$dir���ַ�(./folder/file.txtɾ��./folder/)   
 
                 // 2.������/��ɾ��(/file.txtɾ��/)   
 
                 $file = substr($file, strlen($dir));   
 
                 if(substr($file, 0, 1) == "\\" || substr($file, 0, 1) == "/"){ $file = substr($file, 1); }   
 
                     
 
                 $this->addFile($content, $file);   
 
             }   
 
             $out = $this->file();   
 
         
 
             $fp = fopen($saveName, "wb");   
 
             fwrite($fp, $out, strlen($out));   
 
             fclose($fp);   
 
         }   
 
         
 
         
 
         // ------------------------------------------------------ //   
 
         // #ѹ����ֱ������   
 
         //   
 
         // $archive = new PHPZip();   
 
         // $archive->ZipAndDownload("��ѹ�����ļ�����Ŀ¼");   
 
         // ------------------------------------------------------ //   
 
         public function ZipAndDownload($dir)   
 
         {   
 
             if(@!function_exists('gzcompress')){ return; }   
 
         
 
             ob_end_clean();   
 
             $filelist = $this->visitFile($dir);   
 
             if(count($filelist) == 0){ return; }   
 
         
 
             foreach($filelist as $file)   
 
             {   
 
                 if(!file_exists($file) || !is_file($file)){ continue; }   
 
                     
 
                 $fd       = fopen($file, "rb");   
 
                 $content  = @fread($fd, filesize($file));   
 
                 fclose($fd);   
 
         
 
                 // 1.ɾ��$dir���ַ�(./folder/file.txtɾ��./folder/)   
 
                 // 2.������/��ɾ��(/file.txtɾ��/)   
 
                 $file = substr($file, strlen($dir));   
 
                 if(substr($file, 0, 1) == "\\" || substr($file, 0, 1) == "/"){ $file = substr($file, 1); }   
 
                     
 
                 $this->addFile($content, $file);   
 
             }   
 
             $out = $this->file();   
 
         
 
             @header('Content-Encoding: none');   
 
             @header('Content-Type: application/zip');   
 
             @header('Content-Disposition: attachment ; filename=Farticle'.date("YmdHis", time()).'.zip');   
 
             @header('Pragma: no-cache');   
 
             @header('Expires: 0');   
 
             print($out);   
 
         }   
 
         
             
         /**********************************************************  
 
          * ��ѹ����  
 
          **********************************************************/  
 
         // ------------------------------------------------------ //   
 
         // ReadCentralDir($zip, $zipfile)   
 
         // $zip�Ǿ���@fopen($zipfile, 'rb')�





摘自 lpdx111的专栏
 

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