PHP
发布时间:2019-11-18 发布网站:大佬教程 code.js-code.com
大佬教程收集整理的这篇文章主要介绍了php zip文件解压类代码,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
<div class="codetitle"><a style="cursOR: pointer" data="49892" class="copybut" id="copybut49892" onclick="doCopy('code49892')"> 代码如下:
<div class="codebody" id="code49892">
class zip
{ var $datasec,$ctrl_dir = array(
); var $eof_ctrl_dir = "\x50\x4b\x05\x06\x00\x00\x00\x00";
var $old_offset = 0; var $dirs = Array("."
); function get_List($zip_
Name) { $zip = @fopen($zip_name,'rb'
); if(!$zi
p) return(0
); $centd = $this->ReadCentralDir($zip,$zip_
Name);
@rewind($zi
p);
@fseek($zip,$centd['offset']
); for ($i
=0; $i<$centd['entries']; $i++)
{ $header = $this->ReadCentralFileHeaders($zi
p);
$header['index'] = $i;$info['fil
ename'] = $header['fil
ename'];
$info['stored_fil
ename'] = $header['stored_fil
ename'];
$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 Add($files,$compact)
{ if(!is_array($files
[0])) $files=Array($files
); for($i
=0;$files[$i];$i++)
{ $fn = $files[$i];
if(!in_Array(dirname($fn
[0]),$this->dirs))
$this->add_Dir(dirname($fn
[0])
); if(bas
ename($fn
[0]))
$ret[bas
ename($fn
[0])]=$this->add_File($fn[1],$fn
[0],$compact
); }
return $ret;
}
function get_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";
}
function add_dir($
Name) { $name = str_
replace("\","/",$
Name);
$fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$fr .= pack("V",0).pack("V",0).pack("v",strlen($
Name) ); $fr .= pack("v",0 ).$name.pack("V",0
); $this -> datasec[] = $fr;
$new_offset = strlen(implode("",$this->datase
C)); $cdrec = "\x50\x4b\x01\x02\x00\x00\x0a\x00\x00\x00\x00\x00\x00\x00\x00\x00";
$cdrec .= pack("V",strlen($
Name) ); $cdrec .= pack("v",0 ).pack("v",0
); $ext = "\xff\xff\xff\xff";
$cdrec .= pack("V",16 ).pack("V",$this -> old_offset ).$name;
$this -> ctrl_dir[] = $cdre
c; $this -> old_offset = $new_offset;
$this -> dirs[] = $name;
}
function add_File($data,$name,$compact = 1)
{ $name = str_
replace('\','/',$
Name);
$dtime = dechex($this->DosTime()
); $hexdtime = '\x' . $dtime[
6] . $dtime[7].'\x'.$dtime[4] . $dtime
[5]
. '\x' . $dtime[2] . $dtime
[3].'\x'.$dtime
[0].$dtime[1];
eval('$hexdtime = "' . $hexdtime . '";'
); if($compact)
$fr = "\x50\x4b\x03\x04\x14\x00\x00\x00\x08\x00".$hexdtime;
else $fr = "\x50\x4b\x03\x04\x0a\x00\x00\x00\x00\x00".$hexdtime;
$unc_len = strlen($data
); $crc = crc32($data
); if($compact)
{ $zdata = gzcompress($data
); $c_len = strlen($zdata
); $zdata = substr(substr($zdata,strlen($zdata) - 4),2
); }else
{ $zdata = $data;
}
$c_len=strlen($zdata
); $fr .= pack('V',$cr
C).pack('V',$c_len).pack('V',$unc_len
); $fr .= pack('v',strlen($
Name)).pack('v',0).$name.$zdata;
$fr .= pack('V',$unc_len
); $this -> datasec[] = $fr;
$new_offset = strlen(implode('',$this->datase
C)); if($compact)
$cdrec = "\x50\x4b\x01\x02\x00\x00\x14\x00\x00\x00\x08\x00";
else $cdrec = "\x50\x4b\x01\x02\x14\x00\x0a\x00\x00\x00\x00\x00";
$cdrec .= $hexdtime.pack('V',$unc_len
); $cdrec .= pack('v',strlen($
Name) ).pack('v',0 ).pack('v',0
); $cdrec .= pack('v',0 ).pack('V',32
); $cdrec .= pack('V',$this -> old_offset
); $this -> old_offset = $new_offset;
$cdrec .= $name;
$this -> ctrl_dir[] = $cdre
c; return true;
}
function DosTime()
{ $timearray = getdate(
); if ($timearra
Y['year'] <
1980)
{ $timearra
Y['year'] =
1980; $timearra
Y['mon'] = 1;
$timearra
Y['mday'] = 1; $timearra
Y['hours'] = 0;
$timearra
Y['
minutes'] = 0; $timearra
Y['seconds'] = 0;
}
return (($timearra
Y['year'] -
1980) << 25) | ($timearra
Y['mon'] << 21) | ($timearra
Y['mday'] << 16) | ($timearra
Y['hours'] << 11) |
($timearra
Y['
minutes'] << 5) | ($timearra
Y['seconds'] >> 1
); }
function Extract ( $zn,$to,$index = Array(-1) )
{ $ok = 0; $zip = @fopen($zn,'rb'
); if(!$zi
p) return(-1
); $cdir = $this->ReadCentralDir($zip,$zn
); $pos_entry = $cdir['offset'];
if(!is_array($inde
X))
{ $index = array($inde
X); }
for($i
=0; $index[$i];$i++)
{ if(intval($index[$i])
!=$index[$i]||$index[$i]>$cdir['entries'])
return(-1
); }
for ($i
=0; $i<$cdir['entries']; $i++)
{ @fseek($zip,$pos_entry
); $header = $this->ReadCentralFileHeaders($zi
p);
$header['index'] = $i; $pos_entry = ftell($zi
p);
@rewind($zi
p); fseek($zip,$header['offset']
); if(in_array("-1",$inde
X)||in_array($i,$inde
X))
$stat[$header['fil
ename']]=$this->ExtractFile($header,$zi
p);
}
fclose($zi
p);
return $stat;
}
function ReadFileHeader($zi
p) { $binary_data = fread($zip,30
); $data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfil
ename_len/vextra_len',$binary_data
); $header['fil
ename'] = fread($zip,$data['fil
ename_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,$year
); } else
{ $header['mtime'] = time(
); }
$header['stored_fil
ename'] = $header['fil
ename'];
$header['status'] = 'ok';
if (substr($header['fil
ename'],-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_siz
E);
$pos = ftell($zi
p); $bytes = 0x00000000;
while ($pos < $siz
E) { $byte = @fread($zip,1
); $bytes=($bytes << 8) | Ord($byt
E);
if ($bytes == 0x504b0506)
{ $pos++; break; } $pos++;
}
$data=unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size',
fread($zip,18)
); if ($data['comment_size']
!= 0)
$centd['comment'] = fread($zip,$data['comment_size']
); else $centd['comment'] = ''; $centd['entries'] = $data['entries'];
$centd['disk_entries'] = $data['disk_entries'];
$centd['offset'] = $data['offset'];$centd['disk_start'] = $data['disk_start'];
$centd['size'] = $data['size']; $centd['disk'] = $data['disk'];
return $centd;
}
function ExtractFile($header,$zi
p) { $header = $this->readfileheader($zi
p);
if(substr($to,-1)
!="/") $to.="/";
if(!@is_dir($to))
@mkdir($to,0777
); $pth = explode("/",dirname($header['fil
ename'])
); for($i
=0;isset($pth[$i]
);$i++)
{ if(!$pth[$i]) con
Tinue;
if(!is_dir($to.$pth[$i]))
@mkdir($to.$pth[$i],0777
); }
if (!($header['external']=
=0x41FF0010)&&!($header['external']==16))
{ if ($header['compression']=
=0)
{ $fp = @fopen($to.$header['fil
ename'],'wb'
); if(!$f
p) return(-1
); $size = $header['compressed_size'];
while ($size
!= 0)
{ $read_size = ($size < 2048 ? $size : 20
48);
$buffer = fread($zip,$read_siz
E);
$binary_data = pack('a'.$read_size,$buffer
); @fwrite($fp,$binary_data,$read_siz
E);
$size -= $read_size;
}
fclose($f
p);
touch($to.$header['fil
ename'],$header['mtime']
); }else
{ $fp = @fopen($to.$header['fil
ename'].'.gz','wb'
); if(!$f
p) return(-1
); $binary_data = pack('va1a1Va1a1',0x8b1f,
chr($header['compression']),
chr(0x00),time(),
chr(0x00),
chr(3)
); fwrite($fp,10
); $size = $header['compressed_size'];
while ($size
!= 0)
{ $read_size = ($size < 1024 ? $size : 10
24);
$buffer = fread($zip,$read_siz
E);
$size -= $read_size;
}
$binary_data = pack('VV',$header['crc'],$header['size']
); fwrite($fp,8
); fclose($f
p);
$gzp = @gzopen($to.$header['fil
ename'].'.gz','rb') or die("
CETte archive est compress閑"
); if(!$gz
p) return(-2
); $fp = @fopen($to.$header['fil
ename'],'wb'
); if(!$f
p) return(-1
); $size = $header['size'];
while ($size
!= 0)
{ $read_size = ($size < 2048 ? $size : 20
48);
$buffer = gzread($gzp,$read_siz
E);
$size -= $read_size;
}
fclose($f
p); gzclose($gz
p);
touch($to.$header['fil
ename'],$header['mtime']
); @unlink($to.$header['fil
ename'].'.gz'
); }}
return true;
}
}
/*
**/
class zip
Peter{ var $_zip_hander = null;
function __construct()
{ }
function get_List($zip_
Name){ $file_list = array(
); $this->_zip_hander = zip_open($zip_
Name);
if ( $this->_zip_hander )
{ while ( $zip_entry = zip_read($this->_zip_hander) )
{ $file_list[] = array('fil
ename'=>zip_entry_name($zip_entry),
'size'=>zip_entry_filesize($zip_entry),
'compressed_size'=>zip_entry_compressedsize($zip_entry)
); }
zip_close($this->_zip_hander
); }
return $file_list;
}
function Extract($zip_name,$folder_
Name){ $this->_zip_hander = zip_open($zip_
Name);
if ( !$this->
checkDirAndMk($folder_
Name) )
{ return
false;
}
if ( substr($folder_name,-1)
!="/" )
{ $folder_name .= "/";
}
if ( $this->_zip_hander )
{ while ( $zip_entry = zip_read($this->_zip_hander) )
{ $file_info = array('fil
ename'=>zip_entry_name($zip_entry),
'compressed_size'=>zip_entry_compressedsize($zip_entry)
); $new_
file_name = $folder_name.$file_info['fil
ename'];
$buf = "";
if (zip_entry_open($this->_zip_hander,$zip_entry,"r"))
{ $buf = zip_entry_read($zip_entry,zip_entry_filesize($zip_entry)
); zip_entry_close($zip_entry
); }
if ( $fp = fopen($new_
file_name,"w") )
{ fwrite($fp,$buf
); fclose($f
p);
}
}
zip_close($this->_zip_hander
); return true;
}
else
{ return
false;
}
}
/
检查目录是否存在,如果不存在是否建立
@param String $dirname完整的实际路径
@param bool $mk如果不存在是否创建
@param int $mode创建权限
@return bool是否创建成功
/
function checkDirAndMk($dirname,$mk=false,$mode=0777){
if ( is_dir($dirName)==true ){
return true;
}
else {
if ($mk==falsE){
return false;
}
else {
$dirpath_a = explode('/',$dirName);
for ($i=0;$i<count($dirpath_a);$i++){
if ( $dirpath_a[$i]=="" ){
conTinue;
}
if ( $path==""||is_dir($path) ){
if ( $path=="" ){
if ( substr(php_OS,3)=="WIN" ){
$path = $dirpath_a[$i];
}
else {
$path .= "/".$dirpath_a[$i];
}
}
else {
$path .= "/".$dirpath_a[$i];
}
if ( is_dir($path) ){
conTinue;
}
else {
@mkdir($path,$modE);
}
}
else {
return false;
}
}
return true;
}
}
}
}
$z = new Zip;
$lst=$z->get_list('test2.zip');
foreach ($lst as $val){
print_r($val)."\n";
}
$zip_obj = new zipPeter();
//$zip_obj->Extract()
$z->Extract('test2.zip',"f:/wytddd",-1 );
//
require_once("zip.lib.
php"
); set_time_limit(100
); //要解压的文件路径
$arch = $_GET["arch"];
if(!$arch || !file_exists($arch))
$z = new Zip;
$l=$z->get_list($arch
); //得到文件列表
$z->Extract($arch,"jieya",-1
); }