TaoLer/app/common/lib/Zip.php
2023-02-11 21:24:02 +08:00

191 lines
6.2 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/*
* @Author: TaoLer <alipey_tao@qq.com>
* @Date: 2021-12-25 15:07:37
* @LastEditTime: 2022-04-16 09:43:05
* @LastEditors: TaoLer
* @Description: 搜索引擎SEO优化设置
* @FilePath: \TaoLer\app\common\lib\Zip.php
* Copyright (c) 2020~2022 http://www.aieok.com All rights reserved.
*/
namespace app\common\lib;
use think\Exception;
class Zip
{
/**
* 保持目录结构的压缩方法
* @param string $zipFile 压缩输出文件 相对或者绝对路径
* @param array|string $folderPaths 要压缩的目录 相对或者绝对路径
* @return void
*/
public static function dirZip(string $zipFile, $folderPaths)
{
//1. $folderPaths 路径为数组
// 初始化zip对象
$zip = new \ZipArchive();
//打开压缩文件
$zip->open($zipFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
if(is_array($folderPaths)) {
foreach($folderPaths as $folderPath) {
if(self::getDirSize($folderPath) == 0) {
continue;
}
// 被压缩文件绝对路径
$rootPath = realpath($folderPath);
// Create recursive directory iterator
//获取所有文件数组SplFileInfo[] $files
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($rootPath),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
//要跳过所有子目录 Skip directories (they would be added automatically)
if (!$file->isDir()) {
// 真实文件路径
$filePath = $file->getRealPath();
// zip文件的相对路径
$relativePath = str_replace('\\','/',str_replace(root_path(), '', $filePath));
//添加文件到压缩包
$zip->addFile($filePath, $relativePath);
}
}
}
} else {
// 2. $folderPaths 路径为string
if(self::getDirSize($folderPaths) == 0) {
throw new \Exception("Directory name must not be empty.");
};
// 被压缩文件绝对路径
$rootPath = realpath($folderPaths);
// Create recursive directory iterator
//获取所有文件数组SplFileInfo[] $files
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($rootPath),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
//要跳过所有子目录 Skip directories (they would be added automatically)
if (!$file->isDir()) {
// 要压缩的文件路径
$filePath = $file->getRealPath();
// zip目录内文件的相对路径
$relativePath = str_replace('\\','/',str_replace(root_path(), '', $filePath));
//添加文件到压缩包
$zip->addFile($filePath, $relativePath);
}
}
}
$zip->close();
}
/**
* 把目录内所有文件进行压缩输出
* @param string $zipFile 压缩文件保存路径 相对路径或者绝对路径
* @param string $folderPath 要压缩的目录 相对路径或者绝对路径
* @return void
*/
public static function zipDir(string $zipFile, string $folderPath)
{
// 初始化zip对象
$zip = new \ZipArchive();
$zip->open($zipFile, \ZipArchive::CREATE | \ZipArchive::OVERWRITE);
$rootPath = realpath($folderPath);
$files = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator($rootPath),
\RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $name => $file) {
if (!$file->isDir()) {
// 要压缩的文件路径
$filePath = $file->getRealPath();
// zip目录内文件的相对路径
$relativePath = substr($filePath, strlen($rootPath) + 1);
// 添加 文件 到 压缩包
$zip->addFile($filePath, $relativePath);
}
}
$zip->close();
}
/**
* 压缩文件
* @param array $files 待压缩文件 array('d:/test/1.txt''d:/test/2.jpg');【文件地址为绝对路径】
* @param string $filePath 输出文件路径 【绝对文件地址】 如 d:/test/new.zip
* @return string|bool
*/
function zip($files, $filePath) {
//检查参数
if (empty($files) || empty($filePath)) {
return false;
}
//压缩文件
$zip = new \ZipArchive();
$zip->open($filePath, \ZipArchive::CREATE);
foreach ($files as $key => $file) {
//检查文件是否存在
if (!file_exists($file)) {
return false;
}
$zip->addFile($file, basename($file));
}
$zip->close();
return true;
}
/**
* zip解压方法
* @param string $filePath 压缩包所在地址 【绝对文件地址】d:/test/123.zip
* @param string $path 解压路径 【绝对文件目录路径】d:/test
* @return bool
*/
function unzip($filePath, $path) {
if (empty($path) || empty($filePath)) {
return false;
}
$zip = new \ZipArchive();
if ($zip->open($filePath) === true) {
$zip->extractTo($path);
$zip->close();
return true;
} else {
return false;
}
}
/**
* 获取文件夹大小
* @param $dir 根文件夹路径
* @return bool|int
*/
public static function getDirSize($dir)
{
if(!is_dir($dir)){
return false;
}
$handle = opendir($dir);
$sizeResult = 0;
while (false !== ($FolderOrFile = readdir($handle))) {
if ($FolderOrFile != "." && $FolderOrFile != "..") {
if (is_dir("$dir/$FolderOrFile")) {
$sizeResult += self::getDirSize("$dir/$FolderOrFile");
} else {
$sizeResult += filesize("$dir/$FolderOrFile");
}
}
}
closedir($handle);
return $sizeResult;
}
}