ホームページ  >  記事  >  バックエンド開発  >  PHP 操作 Zip_PHP チュートリアル

PHP 操作 Zip_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:51:431031ブラウズ

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

rn";   
 
       // foreach($filelist as $file)
 
        // printf("%s
rn", $file);   
 
        // ------------------------------------------------ ------ //
 
       var $fileList = array();   
 
        パブリック関数 visitFile($path)
 
        {
 
             グローバル $fileList;   
 
           $path = str_replace("\", "/", $path);   
 
          $fdir = ディレクトリ($パス);   
 
            
           while(($file = $fdir->read()) !== false)
          {
 
              if($file == '.' || $file == '..'){ 続行; }
 
            
 
                $pathSub = preg_replace("*/{2,}*", "/", $path."/".$file);  // �滻���������
 
                $fileList[] = is_dir($pathSub) ? $pathSub."/" : $pathSub;   
 
            if(is_dir($pathSub)){ $this->visitFile($pathSub); }
          }
           $fdir->close();   
 
           $fileList を返します。   
 
       }
 
            
 
 
        プライベート関数 unix2DosTime($unixtime = 0)
 
        {
            $timearray = ($unixtime == 0) ? getdate() : getdate($unixtime);   
 
       
 
           if($timearray['year'] < 1980)
           {
 
              $timearray['年'] = 1980;   
                $timearray['mon'] = 1;   
                $timearray['mday'] = 1;   
                $timearray['時間'] = 0;   
                $timearray['分'] = 0;   
               $timearray['秒'] = 0;   
            }
        
            return ( ($timearray['year'] - 1980) << 25)
 
                   | ($timearray['mon'] << 21)
 
                 | ($timearray['mday'] <16)
                   | ($timearray['hours'] << 11)
 
                   | ($timearray['分'] <5)
 
                  | ($timearray['秒'] >> 1);   
 
        }
 
            
 
            
 
        var $old_offset = 0;   
 
        プライベート関数 addFile($data, $filename, $time = 0)
       {
 
            $filename = str_replace('\', '/', $filename);   
 
       
 
           $dtime = dechex($this->unix2DosTime($time));   
 
           $hexdtime = 'x' 。 $dtime[6] 。 $dtime[7]
 
                    。 'バツ' 。 $dtime[4] 。 $dtime[5]
 
                     。 'バツ' 。 $dtime[2] 。 $dtime[3]
 
                       。 'バツ' 。 $dtime[0] 。 $dtime[1];   
 
            eval('$hexdtime = "' . $hexdtime . '";');   
 
        
 
           $fr = "x50x4bx03x04";   
 
          $fr .= "x14x00";   
 
          $fr .= "x00x00";   
 
            $fr .= "x08x00";   
 
          $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 .= $ファイル名;   
 
        
 
           $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 = "x50x4bx01x02";   
 
           $cdrec .= "x00x00";   
 
            $cdrec .= "x14x00";   
 
           $cdrec .= "x00x00";   
 
         $cdrec .= "x08x00";   
 
          $cdrec .= $hexdtime;   
 
           $cdrec .= パック('V', $crc);   
 
            $cdrec .= パック('V', $c_len);   
 
            $cdrec .= パック('V', $unc_len);   
 
            $cdrec .= Pack('v', strlen($filename) );   
 
           $cdrec .= パック('v', 0 );   
 
          $cdrec .= パック('v', 0 );   
 
           $cdrec .= パック('v', 0 );   
 
         $cdrec .= パック('v', 0 );   
 
           $cdrec .= パック('V', 32 );   
 
      
 
            $cdrec .= Pack('V', $this->old_offset );   
 
          $this->old_offset = $new_offset;   
 
       
 
            $cdrec .= $ファイル名;   
 
           $this->ctrl_dir[] = $cdrec;   
 
       }
 
            
 
            
 
        var $eof_ctrl_dir = "x50x4bx05x06x00x00x00x00";   
 
        プライベート関数ファイル()
 
         {
 
             $data = implode('', $this->datasec);   
 
             $ctrldir = implode('', $this->ctrl_dir);   
        
 
             $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))
 
                  。 "x00x00";   
 
       }
 
       
 
           
 
       // ------------------------------------------------ ------ //
 
       // #ѹ����������
 
       //
 
       // $archive = new PHPZip();   
 
       // $archive->Zip("��ѹ�����ļ�����Ŀ⁄", "ZIPѹ���ļ���");    
 
         // ------------------------------------------------ ------ //
 
         パブリック関数 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)){ 続行; }
 
                     
 
                 $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("��ѹ�����ļ�����Ŀ⁄");   
 
         // ------------------------------------------------ ------ //
 
         パブリック関数 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)){ 続行; }
 
                     
 
                 $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('コンテンツエンコーディング: なし');   
 
             @header('Content-Type: application/zip');   
 
             @header('Content-Disposition:attachment ; filename=Farticle'.date("YmdHis", time()).'.zip');   
 
             @header('プラグマ: キャッシュなし');   
 
             @header('有効期限: 0');   
 
             print($out);   
 
         }
 
         
             
         /*************************************************** ******
 
          *��ѹ����
 
          ************************************************* ********/
 
         // ------------------------------------------------ ------ //
 
         // ReadCentralDir($zip, $zipfile)
 
         // $zip����@fopen($zipfile, 'rb')�





lpdx111の抜粋
 

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478171.html技術記事 ?php class PHPZip { private $ctrl_dir = array();プライベート $datasec = array(); /************************************************ ********* * *************************************** *...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。