php目录打包下载,PHP指定目录打包成zip下载

PHP指定目录打包成zip下载

6cd5e4fd49658da7be73f2e8e3760c00.png

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

);

```

© 著作权归作者所有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值