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 分享