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

互联网 20-8-22

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

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

(一) 下载tp6框架

composer create-project topthink/think tp6

(二)打包下载类

<?php     namespace Jrk;      class Zipdown     {        /**         * 打包压缩文件及文件夹         *         * @Author Hhy <jackhhy520@qq.com>         * @DateTime 2020-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 <jackhhy520@qq.com>       * @DateTime 2020-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 <jackhhy520@qq.com>         * @DateTime 2020-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 <jackhhy520@qq.com>      * @date: 2020/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);     }

以上就是Thinkphp6如何利用ZipArchive打包下载文件的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: PHP
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:剖析thinkphp下数据库读写分离代码

相关资讯