upload_url = DIR_IMAGE.'images/'.$uid; // 如果路径不存在,创建 if ( !is_dir($this->upload_url) ) mkdir($this->upload_url, 0755,TRUE); } //图片和文件夹展示 public function index(){ // 初始化 $this->init(admin('uid')); // 获取参数 $data = request()->all(); // 目录 $directory = isset($data['directory']) ? $data['directory'] : ''; //新建文件夹 $data['folder_url'] = url('admin/image_manager/folder?'.http_build_query(['directory'=>$directory])); //图片上传 $data['upload_url'] = url('admin/image_manager/upload?'.http_build_query(['directory'=>$directory])); //删除 $data['delete_url'] = url('admin/image_manager/delete?'); //搜索 $data['search_url'] = url('admin/image_manager/index?'.http_build_query(['directory'=>$directory])); // 获取数据 $file_data = $this->get_file_data($data); //dd($file_data); // 图片数据 $data['images'] = $file_data['images']; $data['pagination'] = $file_data['pagination']; $data['parent'] = $this->get_parent_url($data); $data['refresh'] =$this->get_refresh_url($data); $this->assign('data',$data); $this->assign('heading_title','图片管理器'); return $this->fetch(); } public function get_dir($d){ $dir=''; foreach ($d as $v) { $dir.=$v.'/'; } $dir = substr($dir,0,strlen($dir)-1); return $dir; } //图片上传 public function upload(){ // 初始化 $this->init(admin('uid')); // 接收参数 $directory = request('directory',''); // 验证是否有这个文件夹 $directory = $directory ? $this->upload_url.'/'.str_replace('-','/', $directory) : $this->upload_url; // Check its a directory if( !is_dir($directory) ) return ['error'=>'不是一个文件夹']; // 接收文件 $files = request()->file('file'); // 循环上传的文件 foreach( $files as $file ) { // 仅支持字母数字-_ if( !preg_match('/^[A-Za-z0-9\_\.]+$/',$file->getClientOriginalName() )) return ['error'=>'仅支持字母数字-_组合']; //保存图片 $info = $file->move($directory,$file->getClientOriginalName()); // 如果有错误 if( !$info ) return ['error'=>$file->getError()]; } // 上传成功 return ['success'=>'上传成功']; } /** * 新建文件夹 * */ public function folder(){ // 初始化 $this->init(admin('uid')); // 接收参数 $directory = request('directory',''); // 要创建的目录名 $folder = request('folder',''); // 错误提示 if( !$folder ) return ['error'=>'目录名必填']; // 避免特殊字符 $folder = html_entity_decode($folder, ENT_QUOTES, 'UTF-8'); // 仅支持字母数字-_ if( !preg_match('/^[A-Za-z0-9\_\.]+$/',$folder) ) return ['error'=>$folder.' 文件夹仅支持字母数字_组合']; // 验证是否有这个文件夹 $directory = $directory ? $this->upload_url.'/' : $this->upload_url.'/'; // 上级目录 $count = 0; // 替换上级目录 $folder = str_replace(['../', '..\\', '..'],'',$folder,$count); // 有上级目录 if( $count ) return ['error'=>'不支持创建上级目录']; // 不允许多级 if( count(explode('/',$folder)) > 1 ) return ['error'=>'不支持直接创建多级目录']; // 替换上一级 $folder = '/' . trim($folder,'/').'/'; // 拼接路径 $folder = $directory . $folder; // 如果路径不存在,创建 if ( is_dir($folder) ) return ['error'=>'目录已存在']; // 创建文件夹 mkdir($folder, 0755, TRUE); // 创建成功 return ['success'=>'创建成功']; } //删除图片和文件夹 public function delete(){ // 初始化 $this->init(admin('uid')); // 接收参数 $paths = request('path',[]); // 没有要删除的文件夹 if( !$paths ) return ['success'=>'非法操作']; // 删除 foreach ($paths as $key => $value) { // 判断是否增加路径 $paths[$key] = is_dir($value) ? $value : DIR_IMAGE.$value; } // 调用删除 $this->deleteFolderAndFile($paths); // 清除缓存 $this->deleteFolderAndFile([DIR_IMAGE.'cache/images/']); // 删除成功 return ['success'=>'删除成功']; } /** * 删除文件夹以及文件 * * @param $paths 路径 * */ private function deleteFolderAndFile($paths){ // 循环处理 foreach ($paths as $value) { // 替换掉前后路径 $value = str_replace(['../', '..\\', '..'],'', $value); // 判断是文件么 if( is_file($value) ){ // 文件直接删除 unlink($value); }else{ // 如果是目录 $files = []; // Make path into an array $path = [$value]; // While the path array is still populated keep looping through while (count($path) != 0) { $next = array_shift($path); foreach ( glob($next) as $file) { // If directory add to path array if ( is_dir($file) ) $path[] = $file . '/*'; // Add the file to the files to be deleted array $files[] = $file; } } // Reverse sort the file array rsort($files); foreach ($files as $file) { // If file just delete if (is_file($file)) { @unlink($file); // If directory use the remove directory function } elseif (is_dir($file)) { @rmdir($file); } } } } // 返回结果 return ['success'=>'删除成功']; } //取得上一级的链接 public function get_parent_url($data){ $url = []; if (isset($data['directory'])) { // 验证是否有这个文件夹 $d = explode('-', $data['directory'] ); $dir = ''; if(count($d)>1){ for ($i=0; $i <(count($d)-1); $i++) { if($i<(count($d)-2)){ $dir.=$d[$i].'-'; }else{ $dir.=$d[$i]; } } $url['directory']=$dir; } } if (isset($data['target'])) { $url['target']=$data['target']; } if (isset($data['thumb'])) { $url['thumb'] =$data['thumb']; } return url('admin/image_manager/index?'.http_build_query($url)); } //取得刷新的链接(重新加载当前页面的数据) public function get_refresh_url($data){ $url = []; if (isset($data['directory'])) { $url['directory']=$data['directory']; } if (isset($data['target'])) { $url['target']=$data['target']; } if (isset($data['thumb'])) { $url['thumb'] =$data['thumb']; } return url('admin/image_manager/index?'.http_build_query($url)); } //取得图片文件,文件夹数据,分页数据 public function get_file_data($data){ // 判断是不是有搜索名称 $filter_name = isset($data['filter_name']) ? rtrim(str_replace(['../', '..\\', '..', '*'], '', $data['filter_name']), '/') : null; // 验证是否有这个文件夹 $directory = empty( $data['directory'] ) ? $this->upload_url : $this->upload_url.'/'.str_replace('-','/', $data['directory']); // 取得文件夹 $directories = (array) glob($directory . '/' . $filter_name . '*', GLOB_ONLYDIR); // 取得文件 $files = (array) glob($directory . '/' . $filter_name . '*.{jpg,jpeg,png,gif,JPG,JPEG,PNG,GIF}', GLOB_BRACE); // 合并文件夹和文件 $images = array_merge($directories, $files); // 如果没有文件或文件夹 if( empty($images) ) return ['images'=>null,'pagination'=>null]; if( isset($images['error']) ) return ['images'=>null,'pagination'=>null,'error'=>$images['error']]; // 如果没有文件或文件夹 if( !$images ) return ['images'=>null,'pagination'=>null]; //分页用链接 $url = []; if ( isset($data['directory']) ) $url['directory'] = $data['directory']; if ( isset($data['filter_name']) ) $url['filter_name'] = html_entity_decode($data['filter_name'], ENT_QUOTES, 'UTF-8'); if ( isset($data['target']) ) $url['target'] = $data['target']; if ( isset($data['thumb']) ) $url['thumb'] = $data['thumb']; // 分页 $pagination = new LengthAwarePaginator( array_slice($images,(16*(request('page')?request('page')-1:0)),16) ,count($images),16,null,['path'=>url('admin/image_manager/index?'.http_build_query($url))]); // 图片 $images = $pagination->items(); // 循环所有目录及文件 foreach ($images as $image) { // 获取文件名 $name = basename($image); // 获取后缀 $ext = pathinfo($image,PATHINFO_EXTENSION); // 临时数据 $temp = []; $thumb = mb_substr($image, mb_strlen(DIR_IMAGE),mb_strlen($image)); //echo ($thumb); // 如果是图片显示 if( in_array($ext,['jpg','jpeg','png','gif','JPG','JPEG','PNG','GIF']) ){ // 组合参数 //$temp['thumb'] = path_compat($thumb, 100, 100); $temp['thumb'] = $thumb; $temp['name'] = $name; $temp['type'] = 'image'; $temp['path'] = $thumb; // 赋值 $result['images'][] = $temp; } // 如果没有后缀,是目录 if( !$ext ){ // url跳转时的目录 $url['directory'] = rtrim(str_ireplace('/', '-', mb_substr($image, mb_strlen($this->upload_url.'/'),mb_strlen($image))),'-'); // 显示时的目录 $path = str_ireplace('/', '-', $image); // 打开 if ( isset($data['target']) ) $url['target'] = $data['target']; // 缩略 if (isset($data['thumb'])) $url['thumb'] = $data['thumb']; // 组合参数 $temp['thumb'] = ''; $temp['name'] = $name; $temp['type'] = 'directory'; $temp['path'] = $path; $temp['href'] = url('admin/image_manager/index?'.http_build_query($url)); // 赋值 $result['images'][] = $temp; } } //分页显示 $result['pagination'] = $pagination->render(); //返回列表数据 return $result; } }