fastadmin基于ZipArchive生成压缩文件下载到本地
21-05-25
slbcun
900℃
0
PHP ZipArchive 是PHP自带的扩展类,可以轻松实现ZIP文件的压缩和解压,使用前首先要确保PHP ZIP 扩展已经开启。
数据库图片是多图片以字符串的形式保存,需要转换为数组
前台ajax提交id为多选id,返回压缩后的文件地址,然后下载
/** * 整理下载图片 * 复制图片到统一文件夹,以id作为文件夹名称 * $ids 选中的id [1,2,3] */ public function checks($ids = ''){ $ids = $this->request->post("ids");//页面传值的id $id = explode(",", $ids);//字符串转数组 if (count($id) > 0) { $download_name = Random::uuid();//自动生成文件夹名称 foreach ($id as $v) { $row = $this->model->get(['id' => $v]);//查询数据 $rows = $row->toArray(); if ($rows['id'] && $rows['group_images']) {//group_images:数据库保存图片的字段 $dir = iconv("UTF-8", "GBK", "./ziprar/" . $download_name . "/" . $rows['id']);//图片文件夹放在根目录ziprar里面 if (!file_exists($dir)) {//创建文件夹 mkdir($dir, 0777, true); } $gimgs = explode(",", $rows['group_images']);//图片路径整理 foreach ($gimgs as $vs) { $name_imgs = explode("/", $vs); $names_imgs = $name_imgs['3']; $old_img = ROOT_PATH . 'public' . $vs; $new_img = "./ziprar/" . $download_name . "/" . $rows['id'] . "/" . $names_imgs; if (!file_exists($new_img)) { copy($old_img, $new_img);//复制图片 } } } } $this->zips($download_name); } } /** * 压缩文件夹 */ function addFileToZip($path,$zip){ $handler=opendir($path); //打开当前文件夹$path指定的路径。 while(($filename=readdir($handler))!==false){ if($filename != "." && $filename != ".."){//文件夹文件名字为'.'和‘..',不要对他们进行操作 if(is_dir($path."/".$filename)){// 如果读取的某个对象是文件夹,则递归 $this->addFileToZip($path."/".$filename, $zip); }else{ //将文件加入zip对象 $zip->addFile($path."/".$filename); } } } @closedir($path); } /** * 使用ZipArchive生成压缩文件 */ public function zips($download_name){ $zip=new \ZipArchive(); if($zip->open("./ziprar/".$download_name.'.zip', \ZipArchive::CREATE) === TRUE){ $this->addFileToZip("./ziprar/$download_name"., $zip); $zip->close(); //关闭处理的zip文件 } //判断域名是http还是https if ( !empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off') { $h= 'https://'.$_SERVER['HTTP_HOST']; } elseif ( isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ) { $h= 'https://'.$_SERVER['HTTP_HOST']; } elseif ( !empty($_SERVER['HTTP_FRONT_END_HTTPS']) && strtolower($_SERVER['HTTP_FRONT_END_HTTPS']) !== 'off') { $h= 'https://'.$_SERVER['HTTP_HOST']; }else{ $h= 'http://'.$_SERVER['HTTP_HOST']; } $url = $h."/ziprar/".$download_name.".zip"; //下载文件名 $file_dir = ROOT_PATH . 'public/ziprar/' .$download_name.'.zip'; $this->deldir(ROOT_PATH . 'public/ziprar/' .$download_name.'/'); $this->success('压缩成功,下载中...', $url,'压缩成功'); } /** * 删除文件夹,只保留压缩文件 */ function deldir($dir) { //先删除目录下的文件: $dh=opendir($dir); while ($file=readdir($dh)) { if($file!="." && $file!="..") { $fullpath=$dir."/".$file; if(!is_dir($fullpath)) { unlink($fullpath); } else { $this->deldir($fullpath); } } } closedir($dh); //删除当前文件夹: if(rmdir($dir)) { return true; } else { return false; } }