文件压缩函数

if (!function_exists('zip_file')) {

/**
* 打包压缩文件及文件夹
* @param array $files 文件
* @param string $zipName 压缩包名称
* @param bool $isDown 压缩后是否下载true或false
* @return string 返回结果
*/
function zip_file($files = [], $zipName = '', $isDown = true)
{
// 文件名为空则生成文件名
if (empty($zipName)) {
$zipName = date('YmdHis') . '.zip';
}

// 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释
$zip = new \ZipArchive;
/*
* 通过ZipArchive的对象处理zip文件
* $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
* $zip->open这个方法第一个参数表示处理的zip文件名。
* 这里重点说下第二个参数,它表示处理模式
* ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。
* ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效
* */
if ($zip->open($zipName, \ZIPARCHIVE::OVERWRITE | \ZIPARCHIVE::CREATE) !== true) {
exit('无法打开文件,或者文件创建失败');
}

// 打包处理
if (is_string($files)) {
// 文件夹整体打包
addFileToZip($files, $zip);
} else {
// 文件打包
foreach ($files as $val) {
if (file_exists($val)) {
// 添加文件
$zip->addFile($val, basename($val));
}
}
}
// 关闭
$zip->close();

// 验证文件是否存在
if (!file_exists($zipName)) {
exit("文件不存在");
}

if ($isDown) {
// 下载压缩包
header("Cache-Control: public");
header("Content-Description: File Transfer");
header('Content-disposition: attachment; filename=' . basename($zipName)); //文件名
header("Content-Type: application/zip"); //zip格式的
header("Content-Transfer-Encoding: binary"); //告诉浏览器,这是二进制文件
header('Content-Length: ' . filesize($zipName)); //告诉浏览器,文件大小
@readfile($zipName);
} else {
// 直接返回压缩包地址
return $zipName;
}
}
}

if (!function_exists('addFileToZip')) {

/**
* 添加文件至压缩包
* @param string $path 文件夹路径
* @param $zip zip对象
*/
function addFileToZip($path, $zip)
{
// 打开文件夹
$handler = opendir($path);
while (($filename = readdir($handler)) !== false) {
if ($filename != "." && $filename != "..") {
// 编码转换
$filename = iconv('gb2312', 'utf-8', $filename);
// 文件夹文件名字为'.'和‘..’,不要对他们进行操作
if (is_dir($path . "/" . $filename)) {
// 如果读取的某个对象是文件夹,则递归
addFileToZip($path . "/" . $filename, $zip);
} else {
// 将文件加入zip对象
$file_path = $path . "/" . $filename;
$zip->addFile($file_path, basename($file_path));
}
}
}
// 关闭文件夹
@closedir($path);
}
}

if (!function_exists('unzip_file')) {

/**
* 压缩文件解压
* @param string $file 被解压的文件
* @param $dirname 解压目录
* @return bool 返回结果true或false
*/
function unzip_file($file, $dirname)
{
if (!file_exists($file)) {
return false;
}
// zip实例化对象
$zipArc = new ZipArchive();
// 打开文件
if (!$zipArc->open($file)) {
return false;
}
// 解压文件
if (!$zipArc->extractTo($dirname)) {
// 关闭
$zipArc->close();
return false;
}
return $zipArc->close();
}
}


相关推荐

  • 获取指定目录下的所有图片信息

    1 获取指定目录下的所有图片信息// 获取指定目录下的所有图片信息 public function getImagesInfo($directory) { $images = []; // 创建递归目录迭代器 $iterator = new \RecursiveIteratorIterator( new \RecursiveDirectoryIterator($directory, \RecursiveDirectoryIterator::SKIP_DOTS), \RecursiveIteratorIterator::LEAVES_ONLY ); // 遍历目录中的每个文件 foreach (

  • Thinkphp各版本的PHP要求

    ThinkPHP 8.0:运行环境要求PHP8.0+,兼容PHP8.3ThinkPHP 6.1:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 6.0:运行环境要求PHP7.2+,兼容PHP8.1ThinkPHP 5.1:运行环境要求PHP5.6+,兼容PHP8.0ThinkPHP 5.0:运行环境要求PHP5.4+,兼容PHP7.3

  • Thinkphp5.1路径常量

    1 配置文件位置根目录/config/template.php2 配置文件内容<?php// +----------------------------------------------------------------------// | ThinkPHP [ WE CAN DO IT JUST THINK ]// +----------------------------------------------------------------------// | Copyright (c) 2006~2018 http://thinkphp.cn All rights reser

  • Thinkphp5.0路径常量

    1 配置文件位置根目录/application/模块名/config.php2 配置文件内容<?php//配置文件return [ // 后台视图输出字符串内容替换 'view_replace_str' => [ '__PUBLIC__' => '/', '__STATIC__' => '/static', '__CONSOLE__' => '/static/console', '__CONSOLE_CSS__' => '/static/console/css', '__CONSOLE_IMAGES__' => '/static/console/ima

  • wp站点防止别人进行DDOS攻击

    1 简介wp站点防止别人进行DDOS攻击。2 配置位置位置:根目录/wp-config.php3 配置内容在【根目录/wp-config.php】文件的开头添加如下代码:if(strpos($_SERVER['REQUEST_URI'], 'xmlrpc.php') !== false){ $protocol = $_SERVER['SERVER_PROTOCOL'] ?? ''; if(!in_array($protocol, ['HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3'], true)){ $protocol = 'HTTP/1.0'; } hea

  • 只读属性

    1 只读属性简介只读属性的声明方式类似于普通属性,但需要使用 readonly 关键字。2 只读属性例子class Point { public readonly float $x; public readonly float $y; public function __construct(float $x, float $y) { $this->x = $x; $this->y = $y; }}$point = new Point(3.5, 2.8);echo $point->x; // 输出: 3.5echo $point->y; // 输出: 2.8// 下面的尝