211 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			211 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			PHP
		
	
	
|  | <?php | |||
|  | namespace app\controller\manager; | |||
|  | 
 | |||
|  | use app\service\Image; | |||
|  | use app\model\{System, File}; | |||
|  | use app\validate\Upload as VUpload; | |||
|  | use think\facade\{Filesystem, Config, Lang}; | |||
|  | use think\Image as TImage; | |||
|  | use app\controller\BaseController; | |||
|  | use think\image\Exception as ImageException; | |||
|  | 
 | |||
|  | class Upload extends BaseController | |||
|  | { | |||
|  |     private $isCompress = true; | |||
|  |     private $validate; | |||
|  |     private $uploadPath; | |||
|  |     private $uploadPathIsWritable = 0; | |||
|  | 
 | |||
|  |     public function __construct() | |||
|  |     { | |||
|  |         $system = System::getSystem(); | |||
|  |         if (!empty($system)) { | |||
|  |             $this->isCompress = $system['compress']??true; | |||
|  |         } | |||
|  |         $this->validate = new VUpload(); | |||
|  |         $this->uploadPath = Config::get('filesystem.disks.local.url'); | |||
|  |         if(is_writable(app()->getRootPath() . 'public' . $this->uploadPath)){ | |||
|  |             $this->uploadPathIsWritable = 1; | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //视频上传
 | |||
|  |     public function video() | |||
|  |     { | |||
|  |         if(!$this->uploadPathIsWritable){ | |||
|  |             return $this->json(1, '上传文件夹需要写入权限'); | |||
|  |         } | |||
|  |         $video = request()->file('video'); | |||
|  |         if($this->validate->checkVideo($video)){ | |||
|  |             $src = Filesystem::disk('video')->putFile(date('Ymd'), $video, 'uniqid'); | |||
|  |             $src = $this->uploadPath . '/' . $src; | |||
|  |             $return['src'] = $src; | |||
|  |             //加入上传文件表
 | |||
|  |             $newFile = File::add($video, $src, 'video'); | |||
|  |             $return['fid'] = $newFile->id; | |||
|  |             return $this->json(0, 'ok', $return); | |||
|  |         }else{ | |||
|  |             $errorMsg = Lang::get($this->validate->getError()); | |||
|  |             return $this->json(1, $errorMsg); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //音频上传
 | |||
|  |     public function audio() | |||
|  |     { | |||
|  |         if(!$this->uploadPathIsWritable){ | |||
|  |             return $this->json(1, '上传文件夹需要写入权限'); | |||
|  |         } | |||
|  |         $audio = request()->file('audio'); | |||
|  |         if($this->validate->checkFile($audio)){ | |||
|  |             $src = Filesystem::disk('audio')->putFile(date('Ymd'), $audio, 'uniqid'); | |||
|  |             $src = $this->uploadPath . '/' . $src; | |||
|  |             $return['src'] = $src; | |||
|  |             File::add($audio, $src, 'audio');    //加入上传文件表
 | |||
|  |             return $this->json(0, 'ok', $return); | |||
|  |         }else{ | |||
|  |             $errorMsg = Lang::get($this->validate->getError()); | |||
|  |             return $this->json(1, $errorMsg); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //文件上传(通用)
 | |||
|  |     public function file() | |||
|  |     { | |||
|  |         $file = request()->file('file'); | |||
|  |         if($this->validate->checkFile($file)){ | |||
|  |             try{ | |||
|  |                 if(!$this->uploadPathIsWritable){ | |||
|  |                     throw new \Exception('上传文件夹需要写入权限'); | |||
|  |                 } | |||
|  |                 $src = Filesystem::putFile(date('Ymd'), $file, 'uniqid'); | |||
|  |                 $src = $this->uploadPath . '/' . $src; | |||
|  |                 $return['src'] = $src; | |||
|  |                 $return['name'] = $file->getOriginalName(); | |||
|  |                 File::add($file, $src, 'file');    //加入上传文件表
 | |||
|  |             } catch (\Exception $e) { | |||
|  |                 return $this->json(1, $e->getMessage()); | |||
|  |             } | |||
|  |             return $this->json(0,'ok',$return); | |||
|  |         }else{ | |||
|  |             $errorMsg = Lang::get($this->validate->getError()); | |||
|  |             return $this->json(1, $errorMsg); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //图片上传(通用)
 | |||
|  |     public function image() | |||
|  |     { | |||
|  |         $image = request()->file('image'); | |||
|  | //        $md5     = $image->md5();//文件md5
 | |||
|  | 
 | |||
|  |         if($this->validate->checkImage($image)){ | |||
|  | //            if ($fileItem = File::where('md5', $md5)->find()) {
 | |||
|  | //                $return['src']          = $fileItem['src'];
 | |||
|  | //                $fileItem['updated_at'] = date('Y-m-d H:i:s');
 | |||
|  | //                return $this->json(0, '该文件已存在 路径为:'.$fileItem['src'], $return);
 | |||
|  | //            }
 | |||
|  |             try{ | |||
|  |                 if(!$this->uploadPathIsWritable){ | |||
|  |                     throw new \Exception('上传文件夹需要写入权限'); | |||
|  |                 } | |||
|  |                 $src = Filesystem::putFile(date('Ymd'), $image, 'uniqid'); | |||
|  | 
 | |||
|  |                 $src = $this->uploadPath . '/' . $src; | |||
|  | //                $suffix = strtolower($image->getOriginalExtension());
 | |||
|  | //                if($suffix == 'gif'){
 | |||
|  | //                    $return['thumb_src'] = $src;    //TODO获取GIF缩略图
 | |||
|  | //                }else{
 | |||
|  | //                    $return['thumb_src'] = Image::getThumb($src, 300, 300, TImage::THUMB_SCALING);   //上传返回缩略图宽度为300
 | |||
|  | //                }
 | |||
|  | 
 | |||
|  |                 $return['src'] = $src; | |||
|  | //                if($this->isCompress){
 | |||
|  | //                    Image::resize($src);
 | |||
|  | //                }
 | |||
|  |                 File::add($image, $src);    //加入上传文件表
 | |||
|  |             } catch (\Exception|ImageException $e) { | |||
|  |                 return $this->json(1, $e->getMessage()); | |||
|  |             } | |||
|  |             return $this->json(0, 'ok', $return); | |||
|  |         }else{ | |||
|  |             $errorMsg = Lang::get($this->validate->getError()); | |||
|  |             return $this->json(1, $errorMsg); | |||
|  |         } | |||
|  |     } | |||
|  | 
 | |||
|  |     //富文本编辑器商城图片
 | |||
|  |     public function wangImage() | |||
|  |     { | |||
|  |         $imageArr = request()->file('wang_img'); // 该方式,前端js上传方法中字段名称必须以数组形式传参 如 wang_img[] = 值
 | |||
|  |         $errno = 0; | |||
|  |         $data = []; | |||
|  |         if(!$this->uploadPathIsWritable){ | |||
|  |             $errno = 1; | |||
|  |             $data[] = '上传文件夹需要写入权限'; | |||
|  |         }else{ | |||
|  |             foreach ($imageArr as $image) { | |||
|  |                 if($this->validate->checkImage($image)){ | |||
|  |                     $src = Filesystem::putFile(date('Ymd'), $image, 'uniqid'); | |||
|  |                     $src = $this->uploadPath . '/' . $src; | |||
|  |                     $data[] = $src; | |||
|  |                     if($this->isCompress){ | |||
|  |                         Image::resize($src); | |||
|  |                     } | |||
|  |                     File::add($image, $src);    //加入上传文件表
 | |||
|  |                 }else{ | |||
|  |                     $errno = 1; | |||
|  |                     $data = []; | |||
|  |                     $data[] = Lang::get($this->validate->getError()); | |||
|  |                     break; | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $return['errno'] = $errno; | |||
|  |         $return['data'] = $data; | |||
|  |         return json($return); | |||
|  |     } | |||
|  | 
 | |||
|  |     //富文本编辑器上传图片
 | |||
|  |     public function tinyImage() | |||
|  |     { | |||
|  |         $image = request()->file('file'); | |||
|  | 
 | |||
|  |         if (!$image) { | |||
|  |             // 字段名不对
 | |||
|  |             header("HTTP/1.1 404 config field error"); | |||
|  |             exit; | |||
|  |         } | |||
|  | 
 | |||
|  |         if (!$this->uploadPathIsWritable) { | |||
|  |             header("HTTP/1.1 403 Insufficient folder permissions"); | |||
|  |             exit; | |||
|  |         } else { | |||
|  |             if (!in_array(strtolower($image->getMime()), ['image/png','image/jpeg','image/jpg','image/gif'])) { | |||
|  |                 header("HTTP/1.1 400 MIME TYPE ERROR"); | |||
|  |                 exit; | |||
|  |             } | |||
|  | 
 | |||
|  |             checkPathExistWithMake(public_path().$this->uploadPath.'/images/'.date('Ym')); | |||
|  | 
 | |||
|  |             // tinymce富文本对图片进行操作后(xuan)上传的是blob文件。
 | |||
|  |             // 针对blob文件未读取到后缀名 自动生成后缀 默认用mimetype后缀 如image/jpeg =》jpeg
 | |||
|  |             $newFileName = $image->hashName('uniqid'); | |||
|  |             if (isset(explode('.',$newFileName)[1]) && empty(explode('.',$newFileName)[1])) { | |||
|  |                 $ext = explode('/', $image->getOriginalMime()); | |||
|  |                 $newFileName .= $ext[1]; | |||
|  |             } | |||
|  | 
 | |||
|  |             $src    = Filesystem::putFileAs('images/'.date('Ym'), $image, $newFileName); | |||
|  |             $src    = $this->uploadPath.'/'.$src; | |||
|  |             if ($this->isCompress) { | |||
|  |                 // 剪切
 | |||
|  |                 Image::resize($src); | |||
|  |             } | |||
|  |             File::add($image, $src);    //加入上传文件表
 | |||
|  |             $res['location'] = $src; | |||
|  |             return json($res); | |||
|  |         } | |||
|  |     } | |||
|  | } |