<?php
class PHPZip {
Private $StrPath = "";
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);
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 (preg_match('/\./', $file . @basename())) {
$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);
}
/*
解压缩部分
用途:解压缩文件
参数:$zn需要解压缩的zip文件及路径,$to解压缩的目的地
*/
function Unzip_File($zn, $to, $index = Array(-1)) {
error_reporting(0);
$ok = 0;
$zip = @fopen($zn, 'rb');
IF (!$zip) {
Return(-1);
}
$cdir = $this->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 < $cdir['entries']; $i++) {
@fseek($zip, $pos_entry);
$header = $this->ReadCentralFileHeaders($zip);
$header['index'] = $i;
$pos_entry = ftell($zip);
@rewind($zip);
fseek($zip, $header['offset']);
phpzip系统压缩类
需积分: 9 89 浏览量
2017-11-04
23:14:48
上传
评论
收藏 4KB ZIP 举报
myjf007
- 粉丝: 1
- 资源: 2
最新资源
- 采用P-f和Q-V滞控的去中心化逆变器型交流微电网的模拟(Simulink仿真实现)
- 彩虹聚合二级域名DNS管理系统源码v1.3
- 【TOF相机笔记3】Simulink使用方法
- 算法部署-基于C++和Python使用ONNXRuntime部署RT-DETR目标检测算法-附项目源码-优质项目实战.zip
- Bitree.cpp
- 改变浏览器大小,图片(img)内容居中显示
- 全景分割-基于FAIR-DETR对Cityscapes数据集进行微调实现全景分割-附项目源码-优质项目实战.zip
- Tru master.m4a
- 基于ELMAN神经网络的用气量预测,基于ELMAN的天然气消费量预测(代码完整,数据齐全)
- 基于Vue3+ThreeJS实现机械臂控制和预览+源码+开发文档+代码解析(高分优秀项目)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈