灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2401回复:0

PHP操作Zip

楼主#
更多 发布于:2012-09-12 06:54

<?php  

     class phpZip  

    {  

         private $ctrl_dir     = array();  

         private $datasec      = array();  

    
  

         /**********************************************************  

       * ???????  

        **********************************************************/  

        // ------------------------------------------------------ //  

         // #????????????  

        //  

        // $archive  = new phpZip();  

        // $filelist = $archive->visitFile(?????.??);  

        // print "???????е????:<p>\r\n";  

       // foreach($filelist as $file)  

        //     printf("%s<br>\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'] < 1980)  
           {  

              $timearray['year']    = 1980;  
                $timearray['mon']     = 1;  
                $timearray['mday']    = 1;  
                $timearray['hours']   = 0;  
                $timearray['minutes'] = 0;  
               $timearray['seconds'] = 0;  
            }  
        
            return (  ($timearray['year'] - 1980) << 25)  

                   | ($timearray['mon'] << 21)  

                 | ($timearray['mday'] << 16)  
                   | ($timearray['hours'] << 11)  

                   | ($timearray['minutes'] << 5)  

                  | ($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: p_w_upload ; filename=Farticle'.date("YmdHis", time()).'.zip');  

             @header('Pragma: no-cache');  

             @header('Expires: 0');  

             print($out);  

         }  

        
            
         /**********************************************************  

          * ???????  

          **********************************************************/  

         // ------------------------------------------------------ //  

         // ReadCentralDir($zip, $zipfile)  

         // $zip?????@fopen($zipfile, 'rb')?










摘自 lpdx111的专栏




喜欢0 评分0
游客

返回顶部