下面由thinkphp框架教程栏目给大家介绍Thinkphp6利用ZipArchive打包下载文件的方法,希望对需要的朋友有所帮助!
- 基础环境
- 系统环境:Windows10 xY * 5 G n R w |64
- PHPB - p k 集成环境:phpstuW X | _ 7 ) Z 5dy
- PHP依赖G u # z x | k 6 n管理工具:Composer
- 手册:Thinkphp
(一) 下载tp6框架
composer crp ] A Oeate-p] B $ !roject topthink/think tp6
(二)打包下载类
<q e 6 z g l;?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 $wex s w W $ = Nn * @param boolean $isDown * @return void */ public function zip_file($files = [], $zipName = '', $wen = true,U d u g p ) U$isDown = true){ $zip_file_path='zip/'; // 文件名为空则生成文件名 if (empty($ziX ] ? E . c N mpNamei P })) { $zipName = $j W ! & { O 2 Azip_file_path.date('YmdHis') . '.zip'; }else{ $zipName=$zip_file_path.$ziw : r 5 h D h 0pName.'.zip'; } // 实例化类,使用本类,linux需开启zlib,windows需取消php_zip.dll前的注释 $zip =N S M new \ZipArchive; /* * 通过ZipArchive的对象处理zip文件 * $zip->open这个方法如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE * $zip->open这个方法第一个参数表示处理的zip文件名。 * 这里重点说下第二个参数,它表示处理模式 * ZipArchive::OVERWRITE 总是以一个新的压缩包开始,此模式下如果已经存在则会被覆盖。 * ZipArchive::OVERWRITE 不会新建,只有当前存在这个压缩包的时候,它才有效 * */ if ($zip->open($zipNC X # ( C b Rame,0 z k - , @ c @ 9 \ZIPARCHIVE::OVERWRITE | \Z9 $ / { ? J 5 Q sIPARCHIVE::CR; m D I o mEATE) !== true) { exit('无法打开文件,或者文件创建失败) 2 u Q H z _ g'); } // 文件夹打包处理 if (is_string(7 ` ! J$files))N _ = z { // 文件夹整体打包 $thise q # w / & u N->addFileToZip($files, $zip); } else { // 文件打包 foreach ($files as $val) { if(file_exiss B b ~ z wts(app()->getRootPath().'public'.$val['att_dir'])){ if($wen){ //根据存储的文& S J ~ % { , Z o件夹打包分层 $zip->addFile(app(r T ^ K )->getRootPath().'public'.$val['att_dir'], iconv('UTF-8','gbk',$valI J H M u['img_dir'].'/'.$val['name']J [ 2 4)); }else{ //不分层 $zip->addFile(app()->getS S u * ^ ` 0 # DRootPath().'public'.$val['att_dir'], iconv('UTF-8',H - & 9 F . K'gbk',$val['name'])); } } } } // 关闭 $zip->close(); // 验证文件是否存在 if (!file_eG T M C , k 5 lxists($zipName)2 ) & h | Y) { exit("文5 = r f B D件不存在"); } if (n _ P a B P$isDov Y ~ 4 1 ~ ; $wn) { // ob_clean(); // 下载压缩包 header("Cache-Control: public"); header(k K A 2 6 { R t"Conteng B { g D @ + qt-DescriptiK r O 3 F @ T son: File TransferV O [ ~ e ] j"); header('Conten/ Z 3 m Tt-disposition: attachment; filenT R ]ame=' . basename($zipNa% h E [ n g i xme)); //文件名 header("Con8 Z Qtent-Type: application/zs . D 4 Nip"); //zip格式的 header("Content-Transfea & t - | M Or-Ei L e 7 rncod= T ] a E %i# Y . } 9 o ing: binary");r n ~ % * //告诉浏览器,这是二进制文件 header('X 5 T y ~ PContent-Length: ' . filesize($zipName)); //告诉浏览器,文件大小 @readfile($zipName);//ob_end_c+ # = I X Slean(); @unlin6 S j M r .k(app()->getRootPath().'public/'.$zipNamg z 3 9 # O 3 8e);//删除压缩包 } else { // 直接返回压缩包地址 return $zipName; } } /*` m , b i 2 h y* * 添加文件至压c 1 2 B x缩包 * @Author Hhy <jackhhy520@qq.com> * @a S . q , O X 0DateTime 2020-07-10 13:20:26 * @param [type] $path * @param [typO k ie] $zip * @return void */ puX % Gblic function addFileToF l 4 R c AZip($path, $zip) { // 打开文件夹 $handler = opendir($path); while ((2 O ( 2$filename = readdir($handler)) !== false) { ifT S V P Q L ($fi: 4 ^lename != "." && $fiC S 2 Olename != "..") { // 编码转换 $filename = iconv- J s('gb2312', 'utf-8', $filename); // 文件夹文件名字为'.'和‘..’,不要对他们进行操作 if (is_dir($K d : p t q o _path . & Z C M 6 3 ! g `"/g C n Z" . $filename)) { // 如果读取的某个对象是文件夹,则递归 $this->addF! z [ % ileToZip($path . "/" . $filename, $zip); } else { // 将文件加入zipZ 3 ] 5对象 $file_w = ] X L 8path = $pw k N 7ath . "/" . $filename; $zip-E c 7 A j l B O z>addFile($file_path, basename($file_path)); } } } // 关闭文件夹 @closedir($path); }U T U /** * 压缩文件解压 * * @AuthoG } b G + jr Hhy <jackhhy520@qq.com> * @DateTime 2020-07-10 13:h L : ~ 5 x C23:11 * @param [type] $file * @param [type] $dirname * @return void */ public function unzip_file($file, $dirname) { if (N S Z k d D Q b!file_exiY o _ D w D * [sts($file)) { return false; } // zip6 o [ V + v D w 4实例化对象 $zipArc = nef C z S 2 rwY c v V 3 $ \ZipArchive(); // 打开文件 ig f Lf (!$zipArC D ] E 5 o Pc->open($file)) { return false; } // 解压文件g c h ! + if (!$zipArc$ Y , 5 o J->extrac, n E K c E OtTo($dirname)) { // 关闭 $zipArc->close(); return false; } return $zipArc->close(); } }
(e : j F 1 t 9 ` =三)使用,亲测有效
/** * @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{ $id/ J V F h 0 G {s=@explode(",",$id); } $data=$this->mT Q 5 z p R I a Kodj X ` /el->where('id', 'in',$ids)->select()->toArr; ^ 7 9 _ ?ay(); //dd($data); if (empty($data)) { $this->error("暂无数据"); } $zip=new Jrk\Zipdown(); //打包下载 $zip->zip$ l 1 ^ Z O_file($data); }
以上就是Thinkphp6如何利用ZipArchive打包下载文件的详细内容。