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

                                                       

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

  • 基础环境
    • 系统环境:Windows10 x64
    • PHP集成环境:thinkphp
    • 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-&gt;open这个方法如果对zip文件对象操作成功,$zip-&gt;open这个方法会返回TRUE         * $zip-&gt;open这个方法第一个参数表示处理的zip文件名。         * 这里重点说下第二个参数,它表示处理模式         * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。         * ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效         * */         if ($zip-&gt;open($zipName, ZIPARCHIVE::OVERWRITE | ZIPARCHIVE::CREATE) !== true) {             exit('无法打开文件,或者文件创建失败');         }                // 文件夹打包处理            if (is_string($files)) {                 // 文件夹整体打包                 $this-&gt;addFileToZip($files, $zip);             } else {                  // 文件打包                 foreach ($files as $val) {                     if(file_exists(app()-&gt;getRootPath().'public'.$val['att_dir'])){                         if($wen){                             //根据存储的文件夹打包分层                             $zip-&gt;addFile(app()-&gt;getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['img_dir'].'/'.$val['name']));                         }else{                             //不分层                             $zip-&gt;addFile(app()-&gt;getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$val['name']));                         }                     }                 }             }             // 关闭             $zip-&gt;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()-&gt;getRootPath().'public/'.$zipName);//删除压缩包           } else {              // 直接返回压缩包地址              return $zipName;          }        }       /**       * 添加文件至压缩包       * @Author Hhy <jackhhy520>       * @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 != "." &amp;&amp; $filename != "..") {                    // 编码转换                    $filename = iconv('gb2312', 'utf-8', $filename);                    // 文件夹文件名字为'.'和‘..’,不要对他们进行操作                    if (is_dir($path . "/" . $filename)) {                        // 如果读取的某个对象是文件夹,则递归                        $this-&gt;addFileToZip($path . "/" . $filename, $zip);                    } else {                        // 将文件加入zip对象                        $file_path = $path . "/" . $filename;                        $zip-&gt;addFile($file_path, basename($file_path));                    }                }            }            // 关闭文件夹            @closedir($path);        }         /**         * 压缩文件解压         *         * @Author Hhy <jackhhy520>         * @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-&gt;open($file)) {                return false;            }            // 解压文件            if (!$zipArc-&gt;extractTo($dirname)) {                // 关闭                $zipArc-&gt;close();                return false;            }            return $zipArc-&gt;close();        }     }</jackhhy520></jackhhy520>

(三)使用,亲测有效

 /**      * @author: Hhy <jackhhy520>      * @date: 2020/7/2 0002      * @describe:打包下载      */     public function download(){       $id= $this-&gt;request-&gt;param("id");         if (is_array($id)){             $ids=$id;         }else{             $ids=@explode(",",$id);         }         $data=$this-&gt;model-&gt;where('id', 'in',$ids)-&gt;select()-&gt;toArray();         //dd($data);          if (empty($data)) {             $this-&gt;error("暂无数据");         }         $zip=new JrkZipdown();         //打包下载          $zip-&gt;zip_file($data);     }</jackhhy520>

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享