ZipArchive类—— 一种Zip压缩文档
ZipArchive::addEmptyDir —— Add a new directory 添加一个新目录
ZipArchive::addFile —— Adds a file to a ZIP archive from the given path 从给定的路径获得文件添加到ZIP文件中
bool ZipArchive::addFile(string $filename[,string $localname = NULL]) —— If supplied, this is the local name inside the ZIP archive that will override the​​filename​​. 如果设置,这是在ZIP文件内部重写$filename的文件名(可用"/"的方式添加目录)
ZipArchive::open open a ZIP file archive —— 打开一个ZIP文件
mixed ZipArchive::open(string $filename[,int $flags]) open a new zip archive for reading,writing or midifying 打开一个用于新的,用于读、写、修改的ZIP文件
$flags 1.ZipArchive::CREATE 如果不存在则创建个zip压缩包 2.ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果存在则会被覆盖
ZipArchive::close Close the active archive(opened or newly created) 关闭一个ZIP文件(已打开或新建)
/**
* @desc 获得文件列表 * @param string $dir 目录
* @return array
*/
function list_dir($dir){
$result = array();
if (is_dir($dir)){
$file_dir = scandir($dir);
foreach ($file_dir as $file) {
if ($file == '.' || $file == '..'){
continue;
}
elseif (is_dir($dir.$file)) {
$result = array_merge($result, $this->list_dir($dir.$file.'/'));
}
else{
array_push($result, $dir.$file);
}
}
}
return $result;
} /**
* @desc 将文件夹打包成zip
* @param string $path 文件路径
* @param object $zip 压缩类对象 * @param array $list_dir 文件路径列表
* @param string $preg 正则提取指定目录
*/
function addFileToZip($path, $zip, $list_dir, $preg ) {
$handle = opendir($path);
$i = 0;
while ($filename = readdir($handle)) {
if ($filename != '.' && $filename != '..') {
$newPath = $path . '/' . $filename;
if (is_dir($newPath)) {
$this->addFileToZip($newPath, $zip, $list_dir, $preg);
} else {
if ($rs = preg_match('/' . $preg . '/', $newPath)) {
$zip->addFile($newPath, $list_dir[$i]);
}
$i++;
}
}
}
@closedir($handle);
} /**
* @desc 下载zip
* @param string $filename 文件名 */
function downloadZip($filename) {
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename='.$filename); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: '. filesize($filename)); //告诉浏览器,文件大小
@readfile($filename);
} //执行压缩并下载ZIP文件
$file_url = APP_RESOURCE_ROOT . 'brancList' . DS . $branch_id . DS;//APP_RESOURCE_ROOT自定义项目根路径常量 DS自定义兼容Linux路径分隔符常量 Linux需要修改目录权限777
$dataList = $this->list_dir($file_url);
$new_file = str_replace(APP_RESOURCE_ROOT . 'brancList' . DS, '', $dataList);
$name = "压缩文件.zip"; //最终生成的文件名(含路径)
$zip = new ZipArchive();
$filename = iconv('utf-8', 'gbk', $name);
if ($zip->open($filename, ZipArchive::OVERWRITE)=== TRUE){
$this->addFileToZip($file_url, $zip, $new_file, $preg); //调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
$zip->close(); //关闭处理的zip文件
}
if (!file_exists($filename)) {
touch($filename);
}
$this->downloadZip($filename);
exit;