123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- <?php namespace App\Http\Controllers\Admin;
- use Illuminate\Pagination\LengthAwarePaginator;
- /**
- * 图片管理
- *
- */
- class ImageManager extends Auth{
- //图片保存路径
- private $upload_url;
-
- /* 初始化 */
- protected function init($uid){
- // 上传路径
- $this->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.'/'.str_replace('-','/', $directory) : $this->upload_url.'/';
- // 替换上级目录
- $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) {
- // 替换路径
- $value = str_replace('-','/', $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);
- // 替换成斜杠路径
- $value = str_replace('-','/', $value);
- // 拼接路径
- $value = $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;
- }
- }
|