Thinkphp6利用ZipArchive打包下载文件的方法

  

这篇文章主要介绍Thinkphp6利用ZipArchive打包下载文件的方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

  ,,,,,,,,,,,,,,   ,,,,,,,,,,,,,,

    <李>基础环境
      <李>系统环境:Windows10 x64李 <李> PHP集成环境:phpstudy李 <>李PHP依赖管理工具:作曲家李 <>李手册:Thinkphp李

<强>(一)下载tp6框架

作曲家创建项目topthink/认为tp6 

<强>(二)打包下载类

& lt; ? php   名称空间Jrk;      类Zipdown   {/* *   *打包压缩文件及文件夹   *   * @Author Hhy & lt; jackhhy520@qq.com>   * @DateTime 2020-07-10 13:20:06   * @param数组$文件   * @param字符串$ zipName压缩包名称   * @param布尔温美元   * @param布尔isDown美元   * @return无效   */公共函数zip_file(文件=[],美元zipName=& # 39; & # 39;,温家宝=true,美元美元isDown=true) {      $ zip_file_path=& # 39; zip/& # 39;;//文件名为空则生成文件名   如果(空(zipName美元)){   zipName=zip_file_path.date美元(& # 39;YmdHis& # 39;)。& # 39;. zip # 39;;   其他}{   zipName=zip_file_path美元。美元zipName强生# 39;. zip # 39;;   }//实例化类,使用本类,linux需开启zlib,窗户需取消php_zip.dll前的注释   $ zip=新\ ZipArchive;/*   *通过ZipArchive的对象处理zip文件   * $ zip→打开这个方法如果对邮政文件对象操作成功,$ zip→打开这个方法会返回现实   * $ zip→打开这个方法第一个参数表示处理的zip文件名。   *这里重点说下第二个参数,它表示处理模式   * ZipArchive::覆盖总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。   * ZipArchive::覆盖不会新建,只有当前存在这个压缩包的时候,它才有效   * */如果($ zip→打开(zipName美元\ ZIPARCHIVE::覆盖| \ ZIPARCHIVE::创建)!==true) {   退出(& # 39;无法打开文件,或者文件创建失败& # 39;);   }//文件夹打包处理   如果(is_string(文件)美元){//文件夹整体打包   $ this→addFileToZip(文件、邮政美元);   其他}{//文件打包   foreach(文件val美元){   如果(file_exists(应用程序()→getRootPath()强生# 39;公共# 39;。美元val [& # 39; att_dir& # 39;])) {   如果温($){//根据存储的文件夹打包分层   $ zip→addFile(应用程序()→getRootPath()强生# 39;公共# 39;。美元val [& # 39; att_dir& # 39;], iconv (& # 39; utf - 8 # 39; & # 39; gbk # 39;, val美元[& # 39;img_dir& # 39;] # 39;公司/& # 39;。美元val[& # 39;名字# 39;]));   其他}{//不分层   $ zip→addFile(应用程序()→getRootPath()强生# 39;公共# 39;。美元val [& # 39; att_dir& # 39;], iconv (& # 39; utf - 8 # 39; & # 39; gbk # 39;, val美元[& # 39;名字# 39;]));   }   }   }   }//关闭   $ zip→close ();//验证文件是否存在   如果(! file_exists (zipName美元)){   退出(“文件不存在“);   }      如果(isDown美元){//ob_clean ();//下载压缩包   标题(“cache - control: public");   标题(“内容描述:文件Transfer");   头(& # 39;附加项:附件;文件名=& # 39;。basename (zipName美元));//文件名   标题(“内容类型:应用程序/zip");//zip格式的   标题(“Content-Transfer-Encoding: binary");//告诉浏览器,这是二进制文件   头(& # 39;内容长度:& # 39;。文件大小(zipName美元));//告诉浏览器,文件大小   @readfile ($ zipName);//ob_end_clean ();   @unlink(应用程序()→getRootPath()强生# 39;公共/& # 39;zipName美元);//删除压缩包      其他}{//直接返回压缩包地址   返回zipName美元;   }   }/* *   *添加文件至压缩包   * @Author Hhy & lt; jackhhy520@qq.com>   * @DateTime 2020-07-10 13:20:26   * @param[型]美元路径   * @param[型]$ zip   * @return无效   */公共函数addFileToZip(路径,zip美元)   {//打开文件夹   处理程序=美元opendir($路径);   而(($ filename=readdir(处理器)美元)!==false) {   if ($ filename !=?”,,美元文件名!=? .“){//编码转换   $ filename=iconv (& # 39; gb2312 # 39;, & # 39; utf - 8 # 39;, $ filename);//文件夹文件名字为& # 39;强生# 39;和“. .”,不要对他们进行操作   如果美元(is_dir(路径。“/?。$ filename)) {//如果读取的某个对象是文件夹,则递归   $ this→addFileToZip($路径。“/?。文件名,zip美元);   其他}{//将文件加入邮政对象   file_path=美元路径。“/?。美元的文件名;   $ zip→addFile (file_path美元,basename (file_path美元));   }   }   }//关闭文件夹   @closedir(路径);   }/* *   *压缩文件解压   *   * @Author Hhy & lt; jackhhy520@qq.com>   * @DateTime 2020-07-10 13:23:11   * @param[型]美元文件   * @param[型]目录名   * @return无效   */公共函数unzip_file(文件,目录名美元)   {   如果(! file_exists(文件)美元){   返回错误;   }//zip实例化对象   美元zipArc=new \ ZipArchive ();//打开文件   如果(! $ zipArc→打开(文件)美元){   返回错误;   }//解压文件   如果(! $ zipArc→extractTo(目录名)美元){//关闭   美元zipArc→close ();   返回错误;   }   返回$ zipArc→close ();   }   }

Thinkphp6利用ZipArchive打包下载文件的方法