Thinkphp6如何利用ZipArchive打包下载文件

发布时间 - 2020-08-22 00:00:00    点击率:

下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!

  • 基础环境
    • 系统环境:Windows10 x64
    • PHP集成环境:phpstudy
    • PHP依赖管理工具:Composer
    • 手册:Thinkphp

(一) 下载tp6框架

composer create-project topthink/think tp6

(二)打包下载类


        * @DateTime 2025-07-10 13:20:06
        * @param array $files
        * @param string $zipName 压缩包名称
        * @param boolean $wen 
        * @param boolean $isDown
        * @return void
        */ 
       public function zip_file($files = [], $zipName = '', $wen = true,$isDown = true){

        $zip_file_path='zip/';
        // 文件名为空则生成文件名
        if (empty($zipName)) {
            $zipName = $zip_file_path.date('YmdHis') . '.zip';
        }else{
            $zipName=$zip_file_path.$zipName.'.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)) {
                // 文件夹整体打包
                $this->addFileToZip($files, $zip);
            } else {
                 // 文件打包
                foreach ($files as $val) {
                    if(file_exists(app()->getRootPath().'public'.$val['att_dir'])){
                        if($wen){
                            //根据存储的文件夹打包分层
                            $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['img_dir'].'/'.$val['name']));
                        }else{
                            //不分层
                            $zip->addFile(app()->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['name']));
                        }
                    }
                }
            }
            // 关闭
            $zip->close();

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

        if ($isDown) {
            // ob_clean();
             // 下载压缩包
             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);//ob_end_clean();
             @unlink(app()->getRootPath().'public/'.$zipName);//删除压缩包

         } else {
             // 直接返回压缩包地址
             return $zipName;
         }
       }

     /**
      * 添加文件至压缩包
      * @Author Hhy 
      * @DateTime 2025-07-10 13:20:26
      * @param [type] $path
      * @param [type] $zip
      * @return void
      */  
     public 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)) {
                       // 如果读取的某个对象是文件夹,则递归
                       $this->addFileToZip($path . "/" . $filename, $zip);
                   } else {
                       // 将文件加入zip对象
                       $file_path = $path . "/" . $filename;
                       $zip->addFile($file_path, basename($file_path));
                   }
               }
           }
           // 关闭文件夹
           @closedir($path);
       }

       /**
        * 压缩文件解压
        *
        * @Author Hhy 
        * @DateTime 2025-07-10 13:23:11
        * @param [type] $file
        * @param [type] $dirname
        * @return void
        */
    public  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();
       }
    }

(三)使用,亲测有效

 /**
     * @author: Hhy 
     * @date: 2025/7/2 0002
     * @describe:打包下载
     */
    public function download(){
      $id= $this->request->param("id");
        if (is_array($id)){
            $ids=$id;
        }else{
            $ids=@explode(",",$id);
        }
        $data=$this->model->where('id', 'in',$ids)->select()->toArray();
        //dd($data);

        if (empty($data)) {
            $this->error("暂无数据");
        }
        $zip=new Jrk\Zipdown();
        //打包下载
         $zip->zip_file($data);
    }


# php  # 压缩包  # 打包下载  # 递归  # 压缩文件  # 这是  # 暂无  # 第一个  # 本类  # 第二个  # 给大家 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: iOS正则表达式验证手机号、邮箱、身份证号等  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  如何基于云服务器快速搭建网站及云盘系统?  bing浏览器学术搜索入口_bing学术文献检索地址  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  高防服务器如何保障网站安全无虞?  Laravel如何实现API版本控制_Laravel API版本化路由设计策略  网站建设保证美观性,需要考虑的几点问题!  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Linux系统命令中screen命令详解  如何将凡科建站内容保存为本地文件?  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何用IIS7快速搭建并优化网站站点?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Laravel如何实现API资源集合?(Resource Collection教程)  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】  教你用AI润色文章,让你的文字表达更专业  Android自定义控件实现温度旋转按钮效果  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  JavaScript数据类型有哪些_如何准确判断一个变量的类型  中山网站制作网页,中山新生登记系统登记流程?  做企业网站制作流程,企业网站制作基本流程有哪些?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  青岛网站建设如何选择本地服务器?  如何获取上海专业网站定制建站电话?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  如何在万网主机上快速搭建网站?  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  Python文件异常处理策略_健壮性说明【指导】  如何用景安虚拟主机手机版绑定域名建站?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  如何在阿里云部署织梦网站?  如何彻底卸载建站之星软件?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  使用spring连接及操作mongodb3.0实例  Python数据仓库与ETL构建实战_Airflow调度流程详解  如何获取PHP WAP自助建站系统源码?  Bootstrap整体框架之CSS12栅格系统  公司网站制作需要多少钱,找人做公司网站需要多少钱?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?