221 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			221 lines
		
	
	
		
			8.9 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; | |||
|  | 
 | |||
|  | class Upload extends BaseController | |||
|  | { | |||
|  |     protected $noNeedLogin = ['video', 'file', 'image', 'wangImage']; | |||
|  |     private $isCompress = true; | |||
|  |     private $validate; | |||
|  |     private $uploadPath; | |||
|  |     private $videoUploadPath; | |||
|  |     private $uploadPathIsWritable = 0; | |||
|  |     private $videoUploadPathIsWritable = 0; | |||
|  |     private $DIRECTORY_SEPARATOR = "/"; | |||
|  |     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'); | |||
|  |         $this->videoUploadPath = Config::get('filesystem.disks.video.url'); | |||
|  |         if (is_writable(app()->getRootPath().'public'.$this->uploadPath)) { | |||
|  |             $this->uploadPathIsWritable = 1; | |||
|  |         } | |||
|  |         if (is_writable(app()->getRootPath().'public'.$this->videoUploadPath)) { | |||
|  |             $this->videoUploadPathIsWritable = 1; | |||
|  |         } | |||
|  |         $this->DIRECTORY_SEPARATOR = DIRECTORY_SEPARATOR == "\\" ? "/" : DIRECTORY_SEPARATOR; | |||
|  |         ini_set('max_execution_time', '0'); | |||
|  |         ini_set("memory_limit", '-1'); | |||
|  |         set_time_limit(0); | |||
|  |     } | |||
|  | 
 | |||
|  |     //视频上传
 | |||
|  |     public function video() | |||
|  |     { | |||
|  |         $video = request()->file('video_video'); | |||
|  |         if (!$this->videoUploadPathIsWritable) { | |||
|  |             return $this->json(1, '上传文件夹需要写入权限'); | |||
|  |         } | |||
|  |         if ($this->validate->checkVideo($video)) { | |||
|  |             $md5 = $video->md5();//文件md5
 | |||
|  |             if ($fileItem = File::where('md5', $md5)->find()) { | |||
|  |                 $return['src']          = $fileItem['src']; | |||
|  |                 $fileItem['updated_at'] = date('Y-m-d H:i:s'); | |||
|  |                 $fileItem->save(); | |||
|  |                 return $this->json(200, '该文件已存在 路径为:'.$fileItem['path'], $return); | |||
|  |             } | |||
|  | 
 | |||
|  |             $path    = request()->param('path/s', '');//指定路径 基于public下  若为空则默认
 | |||
|  |             $hasPath = !empty($path); | |||
|  | 
 | |||
|  |             // 去除以/storage/开头的部分  如/storage/20210808/test => 20210808/test
 | |||
|  |             $path     = ltrim(trim($path, $this->DIRECTORY_SEPARATOR), \app\model\Attachment::ROOT_NAME . $this->DIRECTORY_SEPARATOR); | |||
|  |             $datePath = $hasPath ? $path : 'videos'.$this->DIRECTORY_SEPARATOR.date('Ymd');//自定义目录
 | |||
|  |             $src      = Filesystem::putFile($datePath, $video, 'uniqid'); | |||
|  | 
 | |||
|  |             $src = $this->uploadPath.'/'.$src; | |||
|  |             $return['src'] = $src; | |||
|  |             File::add($video, $src, $md5, 'video');    //加入上传文件表
 | |||
|  |             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_file'); | |||
|  |         $md5      = $file->md5();//文件md5
 | |||
|  |         $fileName = $file->getOriginalName();//原始文件名
 | |||
|  |         if ($fileItem = File::where('md5', $md5)->find()) { | |||
|  |             $return['src']          = $fileItem['src']; | |||
|  |             $return['name']         = $fileName; | |||
|  |             $fileItem['updated_at'] = date('Y-m-d H:i:s'); | |||
|  |             return $this->json(200, '该文件已存在 路径为:'.$fileItem['path'], $return); | |||
|  |         } | |||
|  |         if ($this->validate->checkFile($file)) { | |||
|  |             try { | |||
|  |                 if (!$this->uploadPathIsWritable) { | |||
|  |                     throw new \Exception('上传文件夹需要写入权限'); | |||
|  |                 } | |||
|  |                 $src            = Filesystem::putFile(date('Ymd'), $file, 'uniqid'); | |||
|  |                 $src            = $this->uploadPath.$this->DIRECTORY_SEPARATOR.$src; | |||
|  |                 $return['src']  = $src; | |||
|  |                 $return['name'] = $fileName; | |||
|  |                 File::add($file, $src, $md5, '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-image避免冲突 layui组件自动生成的隐藏file input框中name容易重名冲突
 | |||
|  |         $image   = request()->file('image_image'); | |||
|  |         $md5     = $image->md5();//文件md5
 | |||
|  |         $type    = request()->param('type/s', ''); | |||
|  |         $path    = request()->param('path/s', '');//指定路径 基于public下  若为空则默认
 | |||
|  |         $hasPath = !empty($path); | |||
|  | 
 | |||
|  |         if ($this->validate->checkImage($image)) { | |||
|  |             $info   = @getimagesize($image->getPathname()); | |||
|  |             $width  = $info[0] ?? 0; | |||
|  |             $height = $info[1] ?? 0; | |||
|  | 
 | |||
|  |             // 海报限制大小 750 * 1334
 | |||
|  |             switch ($type) { | |||
|  |                 case 'porter': | |||
|  |                     if ($width != 750 || $height != 1334) { | |||
|  |                         return $this->json(1, '海报背景图尺寸大小固定为:750 * 1334'); | |||
|  |                     } | |||
|  |                     break; | |||
|  |             } | |||
|  | 
 | |||
|  |             if ($fileItem = File::where('md5', $md5)->find()) { | |||
|  |                 $return['src']          = $fileItem['src']; | |||
|  |                 $fileItem['updated_at'] = date('Y-m-d H:i:s'); | |||
|  | 
 | |||
|  |                 return $this->json(200, '该文件已存在 路径为:'.$fileItem['path'], $return); | |||
|  |             } | |||
|  | 
 | |||
|  |             try { | |||
|  |                 if (!$this->uploadPathIsWritable) { | |||
|  |                     throw new \Exception('上传文件夹需要写入权限'); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 // 去除以/storage/开头的部分  如/storage/20210808/test => 20210808/test
 | |||
|  |                 if (strpos(trim($path, $this->DIRECTORY_SEPARATOR), \app\model\Attachment::ROOT_NAME.$this->DIRECTORY_SEPARATOR) === 0) { | |||
|  |                     $path = substr(trim($path, $this->DIRECTORY_SEPARATOR), strlen(\app\model\Attachment::ROOT_NAME.$this->DIRECTORY_SEPARATOR)); | |||
|  |                 } | |||
|  | 
 | |||
|  |                 $datePath = $hasPath ? $path : date('Ymd');//自定义目录
 | |||
|  |                 $datePath = ($datePath == $this->DIRECTORY_SEPARATOR."storage") ? $this->DIRECTORY_SEPARATOR : $datePath; | |||
|  |                 $src      = Filesystem::putFile($datePath, $image, 'uniqid'); | |||
|  | 
 | |||
|  |                 $src      = $this->uploadPath . $this->DIRECTORY_SEPARATOR . $src; | |||
|  |                 $suffix   = strtolower($image->getOriginalExtension()); | |||
|  |                 if ($suffix == 'gif') { | |||
|  |                     $return['thumb_src'] = $src;    //TODO获取GIF缩略图
 | |||
|  |                 } else { | |||
|  |                     $return['thumb_src'] = Image::getThumb($src, 100, 100, TImage::THUMB_SCALING);   //上传返回缩略图宽度为100
 | |||
|  |                 } | |||
|  |                 $return['src'] = $src; | |||
|  |                 if ($this->isCompress) { | |||
|  |                     Image::resize($src); | |||
|  |                 } | |||
|  |                 File::add($image, $src, $md5);    //加入上传文件表
 | |||
|  |             } 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 wangImage() | |||
|  |     { | |||
|  | 
 | |||
|  |         $imageArr = request()->file('wang_img'); // 该方式,前端js上传方法中字段名称必须以数组形式传参 如 wang_img[] = 值
 | |||
|  |         $errno    = 0; | |||
|  |         $data     = []; | |||
|  | 
 | |||
|  |         if (!$this->uploadPathIsWritable) { | |||
|  |             $errno  = 1; | |||
|  |             $data[] = '上传文件夹需要写入权限'; | |||
|  |         } else { | |||
|  |             foreach ($imageArr as $image) { | |||
|  |                 $md5 = $image->md5();//文件md5
 | |||
|  |                 if ($fileItem = File::where('md5', $md5)->find()) { | |||
|  |                     $return['src']          = $fileItem['src']; | |||
|  |                     $fileItem['updated_at'] = date('Y-m-d H:i:s'); | |||
|  | 
 | |||
|  |                     $data[] = $fileItem['src']; | |||
|  |                     $fileItem->save(); | |||
|  |                     continue; | |||
|  |                 } | |||
|  | 
 | |||
|  |                 if ($this->validate->checkImage($image)) { | |||
|  |                     $src    = Filesystem::putFile(date('Ymd'), $image, 'uniqid'); | |||
|  |                     $src    = $this->uploadPath.$this->DIRECTORY_SEPARATOR.$src; | |||
|  |                     $data[] = $src; | |||
|  |                     if ($this->isCompress) { | |||
|  |                         Image::resize($src); | |||
|  |                     } | |||
|  |                     File::add($image, $src, $md5);    //加入上传文件表
 | |||
|  |                 } else { | |||
|  |                     $errno  = 1; | |||
|  |                     $data   = []; | |||
|  |                     $data[] = Lang::get($this->validate->getError()); | |||
|  |                     break; | |||
|  |                 } | |||
|  |             } | |||
|  |         } | |||
|  | 
 | |||
|  |         $return['errno'] = $errno; | |||
|  |         $return['data']  = $data; | |||
|  |         return json($return); | |||
|  |     } | |||
|  | } |