下面給大家介紹Thinkphp6利用ZipArchive打包下載文件的方法,希望對需要的朋友有所幫助!
基礎環境
系統環境:Windows10 x64
PHP集成環境:phpstudy
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@qq.com> * @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@qq.com> * @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(); } }
(三)使用,親測有效
/** * @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{ $ids=@explode(",",$id); } $data=$this->model->where('id', 'in',$ids)->select()->toArray(); //dd($data); if (empty($data)) { $this->error("暫無數據"); } $zip=new Jrk\Zipdown(); //打包下載 $zip->zip_file($data); }