下面由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->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> ??????*?@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> ????????*?@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(); ???????} ????}</jackhhy520></jackhhy520>
(三)使用,親測有效
?/** ?????*?@author:?Hhy?<jackhhy520> ?????*?@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?JrkZipdown(); ????????//打包下載 ?????????$zip->zip_file($data); ????}</jackhhy520>
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END