您好,欢迎访问一九零五行业门户网

PHP:将文件解压成ZIP并且下载到本地

这个功能实现起来并不难,首先我们要找到这个文件的路径。然后在引入第三方类phpzip这个可以在网上搜到,一会我会把他贴出来。有需要的小伙伴可以借鉴一下。
$name = $_server['document_root'] . '/uploads/' . $foldername; $this->tozip($dir,$name ,1,1);
//文件转成zip 格式 function tozip($path, $zipfile, $typ = 1, $todo = 1) { //if(!is_writeable($path)){exit(文件夹不可写!);} $path = str_ireplace(\, /, ($path)); if (is_null($path) or empty($path) or ! isset($path)) { return false; } if (is_null($zipfile) or empty($zipfile) or ! isset($zipfile)) { return false; }// vendor(zip);// echo $server['document_root']./zip.php; include_once($server['document_root']./zip.php); // 载入代码库,注意路径 $zip = new \phpzip; if (substr($path, -1, 1) == /) { $path = substr($path, 0, strlen($path) -1); } ob_end_clean(); switch ($typ) { case 1: $zip->zipdir($path, $zipfile, $todo); break; case 2: $zip->zipfile($path, $zipfile, $todo); break; } if ($todo == 1) { die(); } else { return true; } }
phpzip zip.php文件如下: strpath); 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'); 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 !='.' and $file !='..'){ if(ereg('.' ,$file.@basename())){ $fd=fopen($path.'/'.$file,r); $filevalue=@fread($fd,1024000); fclose ($fd); $this -> addfile($filevalue,'/'.$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'] < readcentraldir($zip, $zn); $pos_entry = $cdir['offset']; if(!is_array($index)){ $index = array($index); } for($i = 0; $index[$i];$i++){ if(intval($index[$i])!= $index[$i] || $index[$i] > $cdir['entries']){return(-1);} } for($i=0;$i readcentralfileheaders($zip); $header['index'] = $i; $pos_entry = ftell($zip); @rewind($zip); fseek($zip, $header['offset']); if(in_array(-1, $index) || in_array($i, $index)){$stat[$header['filename']] = $this -> extractfile($header, $to, $zip);} } fclose($zip); return $stat; } //取得压缩包内的文件信息 function get_list($zip_name){ $zip = @fopen($zip_name, 'rb'); if(!$zip){return(0);} $centd = $this -> readcentraldir($zip, $zip_name); @rewind($zip); @fseek($zip, $centd['offset']); for($i=0;$i readcentralfileheaders($zip); $header['index'] = $i; $info['filename'] = $header['filename']; $info['stored_filename'] = $header['stored_filename']; $info['size'] = $header['size']; $info['compressed_size'] = $header['compressed_size']; $info['crc'] = strtoupper(dechex($header['crc'])); $info['mtime'] = $header['mtime']; $info['comment'] = $header['comment']; $info['folder'] = ($header['external'] == 0x41ff0010 || $header['external'] == 16)?1:0; $info['index'] = $header['index']; $info['status'] = $header['status']; $ret[] = $info; unset($header); } return $ret; } function readfileheader($zip){ $binary_data = fread($zip, 30); $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/vcrc/vcompressed_size/vsize/vfilename_len/vextra_len', $binary_data); $header['filename'] = fread($zip, $data['filename_len']); if($data['extra_len'] != 0){$header['extra'] = fread($zip, $data['extra_len']);}else{$header['extra'] = '';} $header['compression'] = $data['compression']; $header['size'] = $data['size']; $header['compressed_size'] = $data['compressed_size']; $header['crc'] = $data['crc']; $header['flag'] = $data['flag']; $header['mdate'] = $data['mdate']; $header['mtime'] = $data['mtime']; if($header['mdate'] && $header['mtime']){ $hour = ($header['mtime']&0xf800) >> 11; $minute = ($header['mtime']&0x07e0) >> 5; $seconde = ($header['mtime']&0x001f) 2; $year = (($header['mdate']&0xfe00) >> 9) + 1980; $month = ($header['mdate']&0x01e0) >> 5; $day = $header['mdate']&0x001f; $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year); }else{ $header['mtime'] = time(); } $header['stored_filename'] = $header['filename']; $header['status'] = ok; return $header; } function readcentralfileheaders($zip){ $binary_data = fread($zip, 46); $header = unpack('vchkid/vid/vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/vcrc/vcompressed_size/vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/vexternal/voffset', $binary_data); if($header['filename_len'] != 0) $header['filename'] = fread($zip, $header['filename_len']); else $header['filename'] = ''; if($header['extra_len'] != 0) $header['extra'] = fread($zip, $header['extra_len']); else $header['extra'] = ''; if($header['comment_len'] != 0) $header['comment'] = fread($zip, $header['comment_len']); else $header['comment'] = ''; if($header['mdate'] && $header['mtime']){ $hour = ($header['mtime'] &0xf800) >> 11; $minute = ($header['mtime'] &0x07e0) >> 5; $seconde = ($header['mtime'] &0x001f) 2; $year = (($header['mdate'] &0xfe00) >> 9) + 1980; $month = ($header['mdate'] &0x01e0) >> 5; $day = $header['mdate'] &0x001f; $header['mtime'] = mktime($hour, $minute, $seconde, $month, $day, $year); }else{ $header['mtime'] = time(); } $header['stored_filename'] = $header['filename']; $header['status'] = 'ok'; if(substr($header['filename'], -1) == '/') $header['external'] = 0x41ff0010; return $header; } function readcentraldir($zip, $zip_name){ $size = filesize($zip_name); if($size < 277){$maximum_size = $size;}else{$maximum_size = 277;} @fseek($zip, $size - $maximum_size); $pos = ftell($zip); $bytes = 0x00000000; while($pos < $size){ $byte = @fread($zip, 1); $bytes = ($bytes < readfileheader($zip); if(substr($to, -1) != /) $to .= /; if(!@is_dir($to)) @mkdir($to, 0777); $pth = explode(/, dirname($header['filename'])); for($i = 0;isset($pth[$i]);$i++){ if(!$pth[$i]) continue; $pthss .= $pth[$i] . /; if(!is_dir($to . $pthss)) @mkdir($to . $pthss, 0777); } if(!($header['external'] == 0x41ff0010) && !($header['external'] == 16)){ if($header['compression'] == 0){ $fp = @fopen($to . $header['filename'], 'wb'); if(!$fp) return(-1); $size = $header['compressed_size']; while($size != 0){ $read_size = ($size < 2048 ? $size : 2048); $buffer = fread($zip, $read_size); $binary_data = pack('a' . $read_size, $buffer); @fwrite($fp, $binary_data, $read_size); $size -= $read_size; } fclose($fp); touch($to . $header['filename'], $header['mtime']); }else{ $fp = @fopen($to . $header['filename'] . '.gz', 'wb'); if(!$fp) return(-1); $binary_data = pack('va1a1va1a1', 0x8b1f, chr($header['compression']), chr(0x00), time(), chr(0x00), chr(3)); fwrite($fp, $binary_data, 10); $size = $header['compressed_size']; while($size != 0){ $read_size = ($size < 1024 ? $size : 1024); $buffer = fread($zip, $read_size); $binary_data = pack('a' . $read_size, $buffer); @fwrite($fp, $binary_data, $read_size); $size -= $read_size; } $binary_data = pack('vv', $header['crc'], $header['size']); fwrite($fp, $binary_data, 8); fclose($fp); $gzp = @gzopen($to . $header['filename'] . '.gz', 'rb') or die(cette archive est compress閑); if(!$gzp) return(-2); $fp = @fopen($to . $header['filename'], 'wb'); if(!$fp) return(-1); $size = $header['size']; while($size != 0){ $read_size = ($size < 2048 ? $size : 2048); $buffer = gzread($gzp, $read_size); $binary_data = pack('a' . $read_size, $buffer); @fwrite($fp, $binary_data, $read_size); $size -= $read_size; } fclose($fp); gzclose($gzp); touch($to . $header['filename'], $header['mtime']); @unlink($to . $header['filename'] . '.gz'); } } return true; }}
其它类似信息

推荐信息