php上传并解压zip工具,php版zip文件解压工具

说明:

做WEB时用FTP上传零碎的文件会比较费时间,但上传打包后的单个文件会很快,在上传之后可以使用此程序将zip文件解压。代码参考了纯粹空间的“faisun_unzip -在线解压ZIP文件程序 V1.0”,略有修改。

用法:

第一步:制作zip.php文件。

include('zip.class.php');

if (empty($_GET['f'])){

echo 'Usage: ?f=file.zip&d=directory';

}else{

$file = $_GET['f'];

$directory = $_GET['d']; // zip.class.php会处理这块数据

if(preg_match('/\.zip$/mis',$file)){

$z = new zip();

$result=$z->extract($file,$directory);

if($result==-1){

echo "
File: [$file] error.";

}

echo "
Done. Folders: $z->totalFolders , Files: $z->totalFiles .";

}else{

echo "
Wrong file format.";

}

}

?>

第二步:上传后解压。

http://domain/zip.php?f=archive.zip&d=web

#参数“f”是上传的包,“d”是解压到的目录(同级目录)。

下载:

代码:

class zip {

public $totalFiles = 0;

public $totalFolders = 0;

function extract ($zn, $to = './', $index = Array(-1)) {

$ok = 0;

$zip = @fopen($zn, 'rb');

if(!$zip) return(-1);

$cdir = $this->readCentralDir($zip, $zn);

$posEntry = $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 < $cdir['entries']; $i++) {

@fseek($zip, $posEntry);

$header = $this->readCentralFileHeaders($zip);

$header['index'] = $i;

$posEntry = 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 readFileHeader($zip) {

$binaryData = fread($zip, 30);

$data = unpack('vchk/vid/vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $binaryData);

$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){

$binaryData = 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', $binaryData);

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 << 8) | ord($byte);

if ($bytes == 0x504b0506 or $bytes == 0x2e706870504b0506){

$pos++;

break;

}

$pos++;

}

$fdata = fread($zip, 18);

$data = @unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $fdata);

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, $to, $zip){

$header = $this->readFileHeader($zip);

# 创建目录

if (!file_exists($to)){

@mkdir($to);

}else if(file_exists($to) && !is_dir($to)){

@rename($to, $to . '_bak_by_zip');

@mkdir($to);

}

if(substr($to, -1) != "/") $to .= "/";

if($to == './') $to = '';

$pth = explode("/", $to . $header['filename']);

$mydir = '';

for($i = 0;$i < count($pth)-1;$i++){

if(!$pth[$i]) continue;

$mydir .= $pth[$i] . "/";

if((!is_dir($mydir) && @mkdir($mydir, 0777)) || (($mydir == $to . $header['filename'] || ($mydir == $to && $this->totalFolders == 0)) && is_dir($mydir))){

@chmod($mydir, 0777);

$this->totalFolders ++;

echo "[d] $mydir
";

}

}

if(strrchr($header['filename'], '/') == '/') return;

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){

$readSize = ($size < 2048 ? $size : 2048);

$buffer = fread($zip, $readSize);

$binaryData = pack('a' . $readSize, $buffer);

@fwrite($fp, $binaryData, $readSize);

$size -= $readSize;

}

fclose($fp);

touch($to . $header['filename'], $header['mtime']);

}else{

$fp = @fopen($to . $header['filename'] . '.gz', 'wb');

if(!$fp) return(-1);

$binaryData = pack('va1a1Va1a1', 0x8b1f, Chr($header['compression']),

Chr(0x00), time(), Chr(0x00), Chr(3));

fwrite($fp, $binaryData, 10);

$size = $header['compressed_size'];

while ($size != 0){

$readSize = ($size < 1024 ? $size : 1024);

$buffer = fread($zip, $readSize);

$binaryData = pack('a' . $readSize, $buffer);

@fwrite($fp, $binaryData, $readSize);

$size -= $readSize;

}

$binaryData = pack('VV', $header['crc'], $header['size']);

fwrite($fp, $binaryData, 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){

$readSize = ($size < 2048 ? $size : 2048);

$buffer = gzread($gzp, $readSize);

$binaryData = pack('a' . $readSize, $buffer);

@fwrite($fp, $binaryData, $readSize);

$size -= $readSize;

}

fclose($fp);

gzclose($gzp);

touch($to . $header['filename'], $header['mtime']);

@unlink($to . $header['filename'] . '.gz');

}

}

$this->totalFiles ++;

echo "[-] $to$header[filename]
";

return true;

}

}

?>

<完>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值