php压缩文件工具类

jopen 9年前
    <?php         /*        File name: /include/zip.php        Author: Horace 2009/04/15        */         class PHPZip{         var $dirInfo = array("0","0");         var $rootDir = '';         var $datasec = array();         var $ctrl_dir = array();         var $eof_ctrl_dir = "/x50/x4b/x05/x06/x00/x00/x00/x00";         var $old_offset = 0;         function downloadZip(){         createZip($dir, $zipfilename, true);         }         function createZip($dir, $zipfilename, $autoDownload = false){         if (@function_exists('gzcompress')){         @set_time_limit("0");         if (is_array($dir)){         $fd = fopen ($dir, "r");                 $fileValue = fread ($fd, filesize ($filename));         fclose ($fd);         if (is_array($dir)) $filename = basename($dir);         $this -> addFile($fileValue, "$filename");         }else{         $this->dirTree($dir,$dir);         }         $zipfilenametemp = time().$zipfilename;         $out = $this -> filezip();         $fp = fopen($zipfilenametemp, "w");         fwrite($fp, $out, strlen($out));         fclose($fp);         $filesize = filesize($zipfilenametemp);         if ($filesize < 104857600) {         if($autoDownload){         header("Content-type: application/octet-stream");         header("Content-disposition: attachment; filename=".$zipfilename);         }         echo $this -> filezip();         }else{         echo "create zip error!";         }         unlink($zipfilenametemp);         }         }         //get dir tree..         function dirTree($directory,$rootDir){         global $_SERVER,$dirInfo,$rootDir;         $fileDir=$rootDir;         $myDir=dir($directory);         while($file=$myDir->read()){                         if(is_dir("$directory/$file") and $file!="." and $file!=".."){         $dirInfo[0]++;         $rootDir ="$fileDir$file/";         $this -> addFile('', "$rootDir");         //go on n's folders         $this->dirTree("$directory/$file",$rootDir);         }else{         if($file!="." and $file!=".."){         $dirInfo[1]++;         //$fd = fopen ("$directory/$file", "r");         $fileValue = file_get_contents("$directory/$file");         //fclose ($fd);         $this -> addFile($fileValue, "$fileDir$file");         }         }         }         $myDir->close();         }         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;                         } // end if         return (($timearray['year'] - 1980) << 25) | ($timearray['mon'] << 21) | ($timearray['mday'] << 16) |         ($timearray['hours'] << 11) | ($timearray['minutes'] << 5) | ($timearray['seconds'] >> 1);         }         function addFile($data, $name, $time = 0){         $name = str_replace('//', '/', $name);         $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"; // ver needed to extract         $fr .= "/x00/x00"; // gen purpose bit flag         $fr .= "/x08/x00"; // compression method         $fr .= $hexdtime; // last mod time and date         // "local file header" segment         $unc_len = strlen($data);         $crc = crc32($data);         $zdata = gzcompress($data);                         $c_len = strlen($zdata);         $zdata = substr(substr($zdata, 0, strlen($zdata) - 4), 2); // fix crc bug         $fr .= pack('V', $crc); // crc32         $fr .= pack('V', $c_len); // compressed filesize         $fr .= pack('V', $unc_len); // uncompressed filesize         $fr .= pack('v', strlen($name)); // length of filename         $fr .= pack('v', 0); // extra field length         $fr .= $name;         // "file data" segment         $fr .= $zdata;         // "data descriptor" segment (optional but necessary if archive is not         // served as file)         $fr .= pack('V', $crc); // crc32         $fr .= pack('V', $c_len); // compressed filesize         $fr .= pack('V', $unc_len); // uncompressed filesize         // add this entry to array         $this -> datasec[] = $fr;         $new_offset = strlen(implode('', $this->datasec));         // now add to central directory record         $cdrec = "/x50/x4b/x01/x02";         $cdrec .= "/x00/x00"; // version made by         $cdrec .= "/x14/x00"; // version needed to extract                         $cdrec .= "/x00/x00"; // gen purpose bit flag         $cdrec .= "/x08/x00"; // compression method         $cdrec .= $hexdtime; // last mod time & date         $cdrec .= pack('V', $crc); // crc32         $cdrec .= pack('V', $c_len); // compressed filesize         $cdrec .= pack('V', $unc_len); // uncompressed filesize         $cdrec .= pack('v', strlen($name) ); // length of filename         $cdrec .= pack('v', 0 ); // extra field length         $cdrec .= pack('v', 0 ); // file comment length         $cdrec .= pack('v', 0 ); // disk number start         $cdrec .= pack('v', 0 ); // internal file attributes         $cdrec .= pack('V', 32 ); // external file attributes - 'archive' bit set         $cdrec .= pack('V', $this -> old_offset ); // relative offset of local header         $this -> old_offset = $new_offset;         $cdrec .= $name;         // optional extra field, file comment goes here         // save to central directory         $this -> ctrl_dir[] = $cdrec;         }         function filezip(){         $data = implode('', $this -> datasec);         $ctrldir = implode('', $this -> ctrl_dir);         return         $data .         $ctrldir .         $this -> eof_ctrl_dir .         pack('v', sizeof($this -> ctrl_dir)) . // total # of entries "on this disk"         pack('v', sizeof($this -> ctrl_dir)) . // total # of entries overall         pack('V', strlen($ctrldir)) . // size of central dir         pack('V', strlen($data)) . // offset to start of central dir         "/x00/x00"; // .zip file comment length         }         }         ?>   
还有另外一个比较简单的
    <?php                  class createzip        {        /*  @creates a compressed zip file  将多个文件压缩成一个zip文件的函数        *   @$files 数组类型  实例array("1.jpg","2.jpg");          *   @destination  目标文件的路径  如"c:/androidyue.zip"        *   @$overwrite 是否为覆盖与目标文件相同的文件        *   @Recorded By Androidyue        *   @Blog:http://thinkblog.sinaapp.com         */          function create_zip($files = array(),$destination = '',$overwrite = false)         {              //如果zip文件已经存在并且设置为不重写返回false              if(file_exists($destination) && !$overwrite) { return false; }              $valid_files = array();              //if files were passed in...              //获取到真实有效的文件名              if(is_array($files)) {                  //cycle through each file                  foreach($files as $file) {                  //make sure the file exists                      if(file_exists($file)) {                      $valid_files[] = $file;                      }                  }              }              //如果存在真实有效的文件              if(count($valid_files))             {                  //create the archive                  $zip = new ZipArchive();                  //打开文件       如果文件已经存在则覆盖,如果没有则创建                  if($zip->open($destination,$overwrite ? ZIPARCHIVE::OVERWRITE : ZIPARCHIVE::CREATE) !== true) {                      return false;                  }                  //向压缩文件中添加文件                  foreach($valid_files as $file) {                      $zip->addFile($file,$file);                  }                  //关闭文件                  $zip->close();                  //检测文件是否存在                  return file_exists($destination);              }            else{                  //如果没有真实有效的文件返回false                  return false;              }          }                  }        /****         //测试函数        $files=array('temp.php','test.php');        create_zip($files, 'myzipfile.zip', true);        ****/          ?>