本文介绍一个简单的zip压缩服务类 ,服务类代码如下
<?php
class PackService{
//压缩队列
protected $packQueue = [];
//调试
protected $debug = false;
//驱动类
protected $driveHandle;
//压缩文件最后存放的目录路径
protected $dirPath;
//设置打包后压缩包的名称
protected $packName;
//最后保存的完整可访问的压缩包路径
protected $saveZipPath;
/**
* BaseService constructor.
* @param string $tenantCode 分区代码
* @param bool $debug 开启调试
*/
public function __construct(bool $debug = false){
$this->debug = $debug;
$this->driveHandle = new \ZipArchive();
}
/**
* 开启调试
* @author chenja01 2021年12月2日14:19:19
* @param bool $debug 是否开启调试
* @return $this
*/
public function debug(bool $debug = true){
$this->debug = $debug;
return $this;
}
/**
* 设置压缩包保存路径
* @author chenja01 2021年12月8日17:43:04
* @param bool $zipPath 压缩包保存路径
* @return $this
*/
public function setSaveZipName(string $zipName){
$this->saveZipPath = "D:/ziptest/" . $zipName. '-'. time() . ".zip";
$dir = dirname($this->saveZipPath);
if (!is_dir($dir)) self::createDirectory($dir);
return $this;
}
/**
* 创建文件夹
* @param string $path 路径
* @param int $mode 授权
* @param bool $recursive
* @author jinanav 2021/12/11 21:00
* @return bool
*/
public static function createDirectory(string $path,int $mode = 0775,bool $recursive = true)
{
if (is_dir($path)) {
return true;
}
$parentDir = dirname($path);
if ($recursive && !is_dir($parentDir) && $parentDir !== $path) {
static::createDirectory($parentDir, $mode, true);
}
try {
if (!mkdir($path, $mode)) {
return false;
}
} catch (\Exception $e) {
if (!is_dir($path)) {
return false;
}
}
try {
return chmod($path, $mode);
} catch (\Exception $e) {
return false;
}
}
/**
* 设置临时保存的目录
* @author chenja01 2021年12月2日14:38:36
* @param string $path 任务列表
* @return $this
*/
public function setDirPath(string $path){
$this->dirPath = $path;
return $this;
}
/**
* 设置压缩文件名
* @author chenja01 2021年12月2日14:39:38
* @param string $name 压缩文件名
* @return $this
*/
public function setPackName(string $name){
$this->packName = $name;
return $this;
}
/**
* 设置文件队列
* @author chenja01 2021年12月2日14:23:02
* @param array $queue 文件队列
* @return $this
*/
public function setPackQueue(array $queue){
$this->packQueue = array_merge($this->packQueue,$queue);
return $this;
}
/**
* 追加一个需要压缩的文件
* @author chenja01 2021年12月2日14:25:41
* @param string $element 文件名
* @return $this
*/
public function enqueue(string $element){
array_push($this->packQueue,$element);
return $this;
}
/**
* 导入文件路径到压缩队列
* @author chenja01 2021年12月6日15:59:57
* @param string $path 路径
* @return $this
*/
public function appendPath(string $path){
$fileArray = $this->setFileByPath($path);
$this->packQueue = array_merge($this->packQueue,$fileArray);
return $this;
}
/**
* 递归读取目录
* @author chenja01 2021年12月6日15:59:57
* @param string $dir 目录地址
* @return array
*/
public function setFileByPath(string $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->setFileByPath($dir.$file.'/'));
}
else{
array_push($result, $dir.$file);
}
}
}
return $result;
}
/**
* 将文件追加到压缩包
* @author chenja01 2021年12月8日17:39:40
*/
public function build(){
foreach ($this->packQueue as $v){
$this->driveHandle->addFile($v,basename($v));
}
}
/**
* 生成zip包并返回
* @author chenja01 2021年12月8日17:40:43
* @return string
*/
public function result(){
try {
if($this->driveHandle->open($this->saveZipPath,\ZipArchive::CREATE) === true){
//将每个文件放入到压缩包
$this->build();
//关闭压缩包句柄
$this->driveHandle->close();
return $this->saveZipPath;
}
return false;
}catch (\Exception $e){
return false;
}
}
/**
* 打印调试信息
* @author chenja01 2021年12月2日14:28:02
* @param string $element 文件名
*/
public function outDebugInfo(){
$json = [
'文件队列' => $this->packQueue,
'打包后的路径' => $this->saveZipPath
];
exit(json_encode($json,JSON_UNESCAPED_UNICODE));
}
}
使用方式
<?php
<?php
include "pack.php";
$pack = new PackService();
echo $pack->setPackName("test")->setDirPath("/home/wwwroot/default/testzip/")->result();
执行结果