PHP指定目录打包成zip下载
1年前
阅读 3398
评论 0
喜欢 0
Zip.class.php代码:
```php
// +----------------------------------------------------------------------
// | 小黄牛
// +----------------------------------------------------------------------
// | Copyright (c) 2016 www.junphp.com
// +----------------------------------------------------------------------
// | Author: 冯俊豪 - 小黄牛 <1731223728@qq.com>
// +----------------------------------------------------------------------
class Zip {
private $file_count = 0;//目录深度
private $Pakc = '';//
private $datastr_len = 0; //压缩包大小
private $dirstr_len = 0;//目录大小
private $gzfilename = '';//压缩包文件名
private $ziptype = '';//压缩包格式
private $fp; //压缩包写入权限
private $dirstr = '';//目录信息
private $Array = '';//文件目录信息
private $download_rate = 99; //下载速度KB
private $filefilters = array();
/**
* 创建压缩文件
* $SavePath :压缩包保存到的路径
* $Pack :需要打包的目录或文件
* $SaveName :压缩包保存的文件名 默认为空,为空时则使用时间戳充当为文件名,禁止使用中文
* $ZipType :压缩包保存的类型 默认为zip
* $arrayFile:需要下载的目录
* $Output :压缩完成是否输出下载 默认为FALSE 设置为TRUE则输出下载
* @成功返回压缩包路径,错误返回false
*/
public function SaveZip($SavePath,$Pakc,$arrayFile=array(), $SaveName='',$ZipType='zip',$Output=false){
$this->Pakc = $Pakc;
//1、判断压缩包保存是否自定义文件名
if(empty($SaveName)){
$ZipSaveName = time();//使用时间戳当做压缩包保存的文件名
$Path = $SavePath.$ZipSaveName.'.'.$ZipType;//拼接保存路径
}else{
$ZipSaveName = $SaveName;
$Path = $SavePath.$ZipSaveName.'.'.$ZipType;//拼接保存路径
if(is_file($Path)){
die($Path.' -> 文件名已存在!');
}
}
$this->gzfilename = $Path;//将保存路径赋值给成员
//3、判断打包目录是否正确
if(!is_dir($Pakc)){
die($Pakc.' -> 需要打包的目录不存在!');
}else{
$zip = new \ZipArchive();
$res = $zip->open($this->gzfilename, \ZipArchive::OVERWRITE);
if ($res === true) {
$this->ListFile($Pakc,$arrayFile);//将路径分割
$Path = $this->Array;
foreach ($Path as $file) {
//这里直接用原文件的名字进行打包,也可以直接命名,需要注意如果文件名字一样会导致后面文件覆盖前面的文件,所以建议重新命名
$aa = explode('/', $file);
$new_filename = iconv('utf-8',"gbk//IGNORE", $aa[count($aa)-2].'/'.$aa[count($aa)-1]);
$zip->addFile($file, $new_filename);
}
//关闭文件
$zip->close();
}
//5、判断是否要求输出下载
if($Output === true){
$this->ZipDow($this->gzfilename);
}
}
}
/**
* 列出目录下所有文件
* $dir_name :目录名
* @无返回值,直接将字符串信息保存到$Araay成员中,使用|符分割
*/
private function ListFile($dir_name, $array=array()){
$dir_handle=opendir($dir_name);//抑制错误信息显示 便于自定义错误显示
if(!$dir_handle){die("目录打开错误!");}
while(false!==($filename=readdir($dir_handle))){//文件名为‘0’时,readdir返回FALSE,判断返回值是否不全等
//古怪的 is_dir($filename) ! $filename这个路径必须能够寻到!当$filename不存在或者不是目录时返回false
if($filename!='.' && $filename!='..'){
if(is_dir($dir_name.$filename)){//判断 是否为一个目录
$this->ListFile($dir_name.$filename.'/', $array);//$dir_flag标志目录树层次
}else{
foreach ($array as $v) {
if (stripos($dir_name, $v) !== false) {
$this->Array[] = $dir_name.$filename;
break;
}
}
}
}
}
closedir($dir_handle);//关闭目录句柄
}
/**
* 输出压缩包下载
*/
private function ZipDow($url){
sleep(1);
clearstatcache();
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($url));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($url));
ob_clean();
flush();// 刷新内容
$file=fopen($url,"r");
while (!feof($file)){
// 限速发送当前部分文件给浏览者
print fread($file,round($this->download_rate*1024));
flush();// flush 内容输出到浏览器端
usleep(0.5 * 1000 * 1000);// 终端0.5秒后继续
}
fclose($file);// 关闭文件流
// 下载完成,删除文件
@unlink($url);
}
}
```
启用demo.php:
```php
/*压缩*/
//引入Zip类
include 'Zip.class.php';
//实例化Zip类
$zip = new Zip();
//SaveZip参数详解
//$zip->SaveZip('压缩包保存目录','需要打包的根目录', '只需要打包那些目录','压缩包的名称,默认为时间戳','压缩包的类型,默认为zip','是否弹出下载,默认为false');
//目录打包
$zip->SaveZip(
'/var/www/xin_chexian/test/public/',
'/var/www/xin_chexian/test/public/data/',
array(
'ts0001',
'ts0003',
'ts0004',
'ts0005',
'ts0007',
'ts0009',
'ts00011',
),
'',
'zip',
true
);
```
© 著作权归作者所有