zip.php ```php Class PHPZip{ Private $StrPath="../UpLoad"; Private $datasec=array(); Private $ctrl_dir=array(); Private $eof_ctrl_dir="\x50\x4b\x05\x06\x00\x00\x00\x00"; Private $old_offset=0; //压缩后下载 function DownLoad($curdir,$zipfilename,$out) { $zipfilename = strtolower($zipfilename); $curdir = str_ireplace(basename($curdir),"",$curdir); chdir($curdir.$this->StrPath); //ob_start($out); header('Content-Encoding: none'); header('Content-Type: application/zip'); header('Content-Disposition: attachment ; filename='.Str_Replace(".zip","",basename($zipfilename)).'.zip'); header('Pragma: no-cache'); header('Expires: 0'); //ob_flush($out); print($out); } //压缩后保存在服务器,默认在/@Upload下 function SaveFile($curdir,$zipfilename,$out) { $curdir = str_ireplace(basename($curdir),"",$curdir); chdir($curdir.$this->StrPath); $fp = fopen($zipfilename,"wb"); fwrite($fp,$out,strlen($out)); fclose($fp); } //函数用途:压缩文件夹,递归逐层进行 //参数详解:$dir需要压缩的目录,$zipfilename压缩后的文件名及存放路径,$Todo处理方式1提供下载2保存文件在服务器 function ZipDir($dir,$zipfilename,$Todo) { if(!@function_exists('gzcompress')) { return 0; } @set_time_limit("0"); $this->openFile($dir,$zipfilename); $out = $this -> filezip(); Switch ($Todo) { Case "1": $this -> DownLoad(__FILE__,$zipfilename,$out); Break; Case "2": $this -> SaveFile(__FILE__,$zipfilename,$out); Break; } } //函数用途:压缩文件,可以是单个也可以是数组的多个 //参数详解:$file需要压缩的文件(可为数组),$zipfilename压缩后的文件名及存放路径,$Todo处理方式1提供下载2保存文件在服务器 function ZipFile($file,$zipfilename,$Todo) { if(!@function_exists('gzcompress')) { return 0; } if(is_array($file)){ foreach($file as $filename) { if(is_file($filename)) { $fd = fopen ($filename, "rb"); $content = @fread($fd, filesize ($filename)); fclose ($fd); $filename = basename($filename); $this -> addFile($content, $filename); } } } else { if(is_file($file)) { $fd = fopen ($file, "rb"); $content = @fread($fd, filesize($file)); fclose ($fd); $file = basename($file); $this -> addFile($content, $file); } } $out= $this -> filezip(); Switch ($Todo) { Case "1": $this -> DownLoad(__FILE__,$zipfilename,$out); Break; Case "2": $this -> SaveFile(__FILE__,$zipfilename,$out); Break; } } //递归取得下层文件夹下的文件 function openFile($path,$zipName){ $temp_path = $path; $temp_zip_path = $zipName; if($handle = @opendir($path)){ While(false !== ($file=readdir($handle))) { if($file !='.' && $file !='..') { if(is_file($file)) { $fd = fopen($path.'/'.$file,"r"); $fileValue = @fread($fd,1024000); fclose ($fd); $this -> addFile($fileValue,$path.'/'.$file); } else { $this ->openFile($path.'/'.$file,$zipName.'/'.$file); } } } $zipName = $temp_zip_path; $path = $temp_path; closedir($handle); } } function addFile($data,$name,$time=0){ $name = str_replace('\\','/',$name); $name = str_replace('./','',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"; $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($name)); $fr .= pack('v',0); $fr .= $name; $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($name) ); $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 .= $name; $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)) . pack('v',sizeof($this -> ctrl_dir)) . pack('V',strlen($ctrldir)) . pack('V',strlen($data))."\x00\x00"; } 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); } } ?> ``` index.php ```php ZipDir($Path,$ZipFile,$Todo); Break; case "2": $zip->ZipFile($Path,$ZipFile,$Todo); Break; } if($Todo==1) { die(); } else { return true; } } Tozip("../upload", "../upload.zip",1,1); ```