thinkphp备份压缩ZIP文件代码存储参考

落花生 2022-05-06 1 条评论 1272 个足迹 杂事小记,PHP语言

首页 / 杂事小记,PHP语言 / 正文
星环博客

前言

代码包含PHP文件(图片)移动、PHP删除文件、PHP创建目录、PHP删除文件、PHP压缩文件夹、PHP删除非空文件夹、PHP利用HEADER请求头下载

代码

<?php
// +---------------------------------------------------------------------+
// | 清理内存备份功能:UX 04-25
// +---------------------------------------------------------------------+
namespace app\cms\controller;

use app\common\controller\Adminbase;
use think\Controller;
use think\facade\Session;
use think\Db;

class Delspace extends Adminbase
{

    /**
     * 渲染展示页面 
     */
    public function index()
    {
        return $this->fetch();
    }
    
    
    public  function toSexMonth($dateMoth)
    {
        $today = input('param.today') ? input('param.today') : date("Y-m-d");
        $arr = array();
        $old_time = strtotime('-'.$dateMoth.' month',strtotime($today));
        for($i = 0;$i <= $dateMoth; ++$i){
            $t = strtotime("+$i month",$old_time);
            $arr[]=date('Y-m-d',$t);
        }
        return $arr;
    }
    
    /**
     * 备份功能
     */
    public function backups()
    {
        # 获取过期时间戳信息
        $backupDate = $_POST['date'];
        $agoDate = $this->toSexMonth($backupDate)[0];
        $agoDateTime = $agoDate." 00:00:00";
        $agoDateStamp = strtotime($agoDateTime);
        # 获取过期的信息
        $dbMysql = Db::name('mreveal')->where('time' , '<' , $agoDateStamp)->where('hold',0)->select();
        
        # 创建文件
        $zeroFile = "./public/zerofile/";
        $zipPath = "./public/zerofile.zip"; # zip压缩包保存路径
        if(!is_dir($zeroFile)){
            # 创建文件夹
            mkdir($zeroFile,0755,true);
        }else{
            # 删除文件夹
            $this->delDir($zeroFile);
            # 删除ZIP压缩包
            unlink($zipPath);
            # 创建文件夹
            mkdir($zeroFile,0755,true);
        }
        # 循环迁移文件
        foreach($dbMysql as $uxkey => $uxval){
            # 缩略图
            $thumbUrl = ".".explode("||",$uxval['thumb'])[0];
            $thumbUrlEnd = end(explode("/",$thumbUrl));
            if(file_exists($thumbUrl)){
                copy($thumbUrl,$zeroFile.$thumbUrlEnd);
                unlink($thumbUrl);
            }
            # 图标
            $iconUrl = ".".explode("||",$uxval['icon'])[0];
            $iconUrlEnd = end(explode("/",$iconUrl));
            if(file_exists($iconUrl)){
                copy($iconUrl,$zeroFile.$iconUrlEnd);
                unlink($iconUrl);
            }
            # 图片集
            $imgsArr = explode(",",$uxval['imgs']);
            foreach($imgsArr as $uximgs){
                $imgsUrl = ".".explode("||",$uximgs)[0];
                $imgsUrlEnd = end(explode("/",$imgsUrl));
                if(file_exists($imgsUrl)){
                    copy($imgsUrl,$zeroFile.$imgsUrlEnd);
                    unlink($imgsUrl);
                }
            }
        }
        # 导出SQL语句
        $uxSql = "";
        foreach($dbMysql as $uxkey => $uxval){
            $uxSql .= "INSERT INTO `jie_mreveal` VALUES ('1', '".$uxval['title']."', '".$uxval['thumb']."', '".$uxval['details']."', '".$uxval['flag']."', '".$uxval['keywords']."', '".$uxval['description']."', '".$uxval['listorder']."', '".$uxval['uid']."', '".$uxval['username']."', '".$uxval['sysadd']."', '".$uxval['hits']."', '".$uxval['inputtime']."', '".$uxval['updatetime']."', '".$uxval['customurl']."', '".$uxval['url']."', '".$uxval['status']."', '".$uxval['imgs']."', '".$uxval['group']."', '".$uxval['icon']."', '".$uxval['hold']."', '".$uxval['time']."'); \n";
        }
        # 创建sql文件
        $zeroFile = "./public/zerofile/backupSql.sql";
        if(!is_dir($zeroFile)){
            touch($zeroFile,0755,true);
        }
        $fopenFile = fopen($zeroFile,"wb");
        fwrite($fopenFile,$uxSql);
        fclose($fopenFile);
        
        # 压缩文件夹
        try {
            $dirPath = './public/zerofile/';    # 文件夹目录
            $zip = new \ZipArchive();
            if($zip->open($zipPath, \ZipArchive::CREATE|\ZipArchive::OVERWRITE)=== TRUE) {
                # 调用方法,对要打包的根目录进行操作,并将ZipArchive的对象传递给方法
                $this->addFileToZip($zip,$dirPath,$dirPath);
                # 关闭处理的zip文件                    
                $zip->close();
            }
        }
        catch (\Exception $e){
            echo "压缩失败!Error:".$e;
        }
        echo "压缩成功!";
        
        # 获取时间
        $thisDate = date("Ymd");
        # 下载压缩包文件
        $file_name = "zerofile_".$thisDate.".rar";
        if (!file_exists($zipPath)) {
            header('HTTP/1.1 404 NOT FOUND');
        } else {
            # 以只读和二进制模式打开文件
            $file = fopen($zipPath, "rb");
        
            # 告诉浏览器这是一个文件流格式的文件
            Header("Content-type: application/octet-stream");
            # 请求范围的度量单位
            Header("Accept-Ranges: bytes");
            # Content-Length是指定包含于请求或响应中数据的字节长度
            Header("Accept-Length: " . filesize($zipPath));
            # 用来告诉浏览器,文件是可以当做附件被下载,下载后的文件名称为$file_name该变量的值。
            Header("Content-Disposition: attachment; filename=" . $file_name);
        
            # 读取文件内容并直接输出到浏览器
            echo fread($file, filesize($zipPath));
            fclose($file);
            echo "下载压缩包文件!";
        }
        
        # 删除SQL文件
        Db::name('mreveal')->where('time' , '<' , $agoDateStamp)->where('hold',0)->delete();
    
    }
    
    
    /**
     * 添加文件夹里的文件到zip
     * @param  zip   ZipArchive对象
     * @param  path  源文件夹路径
     * @param  root  源文件夹根目录
     * 补充说明:第三个参数建议和第二个参数一样,因为递归会修改第二个参数的值,因此必须传第三个参数
     */
    function addFileToZip($zip,$path,$root){
        $handler=opendir($path); //打开当前文件夹
        while(($filename=readdir($handler))!==false){    
            if($filename != "." && $filename != ".."){//不操作名字为'.'和'..'的文件夹或文件
                if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归
                    addFileToZip($zip,$path."/".$filename,$root);
                }else{ 
                    //将文件加入zip对象,第二个参数是zip里文件的路径
                    $pathFilename=$path . "/" . $filename;
                    $zip->addFile($pathFilename, str_replace($root.'/','',$pathFilename));
                }
            }
        }
        @closedir($path);
    }
    
    /**
     * 刪除目录
     */
    function delDir($directory){//自定义函数递归的函数整个目录
        if(file_exists($directory)){//判断目录是否存在,如果不存在rmdir()函数会出错
            if($dir_handle=@opendir($directory)){//打开目录返回目录资源,并判断是否成功
                while($filename=readdir($dir_handle)){//遍历目录,读出目录中的文件或文件夹
                    if($filename!='.' && $filename!='..'){//一定要排除两个特殊的目录
                        $subFile=$directory."/".$filename;//将目录下的文件与当前目录相连
                        if(is_dir($subFile)){//如果是目录条件则成了
                            delDir($subFile);//递归调用自己删除子目录
                        }
                        if(is_file($subFile)){//如果是文件条件则成立
                            unlink($subFile);//直接删除这个文件
                        }
                    }
                }
                closedir($dir_handle);//关闭目录资源
                rmdir($directory);//删除空目录
            }
        }
    }
    
}

版权声明:本文为原创文章,版权归 星环博客 所有,转载请注明出处!

本文链接: https://xhto.cn/archives/213.html

友情提示:添加友联和友联失效404的请联系博主,并确保自己网站已经添加博主为友联!

2022年05月06日 22:02:23 © 本文允许各作者规范转载

黑色的背后是黎明... + 赞赏博主吧!已经穷的开不起站了~

上一篇 下一篇
奇思幻想
表情
签到
赞一下
踩一下
  • PNG静图表情包
  • GIF动图表情包

评论事项 ( 请使用真实邮箱地址,以便接收评论回复信息 )

 好像有个人,和它做朋友吧~
  1. 2022-05-08 15:37
     

    我又来签到了啦~

赞赏作者

支付宝

微信

支付宝红包码

[ 赞赏码 ]

打开对应软件 - 扫码赞赏

赞赏请备注好昵称和邮箱,方便公布排行榜

博客信息

文章数目79 篇
评论数目166 条
运行天数4年127天
友链特数0 条

广而告之

当前文章标签

https://www.xhto.cn/usr/themes/only/x-data/url.php
当前网站已经离线 - 星环博客
星环博客+https://www.xhto.cn/
https://www.xhto.cn/usr/themes/only/x-user/xeq_zfb.jpg
https://www.xhto.cn/usr/themes/only/x-user/xeq_wx.jpg
https://www.xhto.cn/usr/themes/only/x-user/xeq_hbm.jpg

即将离开 星环博客

您即将离开星环博客,请注意您的帐号和财产安全。


继续访问

星环博客 的运行时间:

花有重开日,人无再少年。

站点创建时间:2020-08-17 +  版权归属 星环博客 所有 +  © 2024 Copyright +  备案号: 粤ICP备2023084320号 +  不理白驹过隙,不信生死有命 +  页面加载速度:86ms
https://www.xhto.cn/usr/themes/only/x-img/xloading.gif