eddy8 /
LightCMS
| 1 | <?php |
||||
| 2 | /** |
||||
| 3 | * Date: 2019/3/16 Time: 13:42 |
||||
| 4 | * |
||||
| 5 | * @author Eddy <[email protected]> |
||||
| 6 | * @version v1.0.0 |
||||
| 7 | */ |
||||
| 8 | |||||
| 9 | namespace App\Http\Controllers\Admin; |
||||
| 10 | |||||
| 11 | use App\Http\Controllers\Controller; |
||||
| 12 | use Illuminate\Http\Request; |
||||
| 13 | use Illuminate\Http\UploadedFile; |
||||
| 14 | use Illuminate\Support\Facades\Storage; |
||||
| 15 | use Intervention\Image\Facades\Image; |
||||
| 16 | use Intervention\Image\Exception\NotReadableException; |
||||
| 17 | |||||
| 18 | class NEditorController extends Controller |
||||
| 19 | { |
||||
| 20 | /** |
||||
| 21 | * 基础功能-图片上传 |
||||
| 22 | * |
||||
| 23 | * @param Request $request |
||||
| 24 | * @param string $type |
||||
| 25 | * @return array |
||||
| 26 | */ |
||||
| 27 | public function serve(Request $request, $type) |
||||
| 28 | { |
||||
| 29 | if (!method_exists(self::class, $type)) { |
||||
| 30 | return [ |
||||
| 31 | 'code' => 1, |
||||
| 32 | 'msg' => '未知操作' |
||||
| 33 | ]; |
||||
| 34 | } |
||||
| 35 | |||||
| 36 | return call_user_func(self::class . '::' . $type, $request); |
||||
| 37 | } |
||||
| 38 | |||||
| 39 | protected function uploadImage(Request $request) |
||||
| 40 | { |
||||
| 41 | if (config('light.image_upload.driver') !== 'local') { |
||||
| 42 | $class = config('light.image_upload.class'); |
||||
| 43 | return call_user_func([new $class, 'uploadImage'], $request); |
||||
| 44 | } |
||||
| 45 | |||||
| 46 | if (!$request->hasFile('file')) { |
||||
| 47 | return [ |
||||
| 48 | 'code' => 2, |
||||
| 49 | 'msg' => '非法请求' |
||||
| 50 | ]; |
||||
| 51 | } |
||||
| 52 | $file = $request->file('file'); |
||||
| 53 | if (!$this->isValidImage($file)) { |
||||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||
| 54 | return [ |
||||
| 55 | 'code' => 3, |
||||
| 56 | 'msg' => '文件不合要求' |
||||
| 57 | ]; |
||||
| 58 | } |
||||
| 59 | |||||
| 60 | $result = $file->store(date('Ym'), config('light.neditor.disk')); |
||||
| 61 | if (!$result) { |
||||
| 62 | return [ |
||||
| 63 | 'code' => 3, |
||||
| 64 | 'msg' => '上传失败' |
||||
| 65 | ]; |
||||
| 66 | } |
||||
| 67 | |||||
| 68 | return [ |
||||
| 69 | 'code' => 200, |
||||
| 70 | 'state' => 'SUCCESS', // 兼容ueditor |
||||
| 71 | 'msg' => '', |
||||
| 72 | 'url' => Storage::disk(config('light.neditor.disk'))->url($result), |
||||
| 73 | ]; |
||||
| 74 | } |
||||
| 75 | |||||
| 76 | public function catchImage(Request $request) |
||||
| 77 | { |
||||
| 78 | if (config('light.image_upload.driver') !== 'local') { |
||||
| 79 | $class = config('light.image_upload.class'); |
||||
| 80 | return call_user_func([new $class, 'catchImage'], $request); |
||||
| 81 | } |
||||
| 82 | |||||
| 83 | $files = array_unique((array) $request->post('file')); |
||||
| 84 | $urls = []; |
||||
| 85 | foreach ($files as $v) { |
||||
| 86 | $image = $this->fetchImageFile($v); |
||||
| 87 | if (!$image || !$image['extension'] || !$this->isAllowedImageType($image['extension'])) { |
||||
| 88 | continue; |
||||
| 89 | } |
||||
| 90 | |||||
| 91 | $path = date('Ym') . '/' . md5($v) . '.' . $image['extension']; |
||||
| 92 | Storage::disk(config('light.neditor.disk')) |
||||
| 93 | ->put($path, $image['data']); |
||||
|
0 ignored issues
–
show
It seems like
$image['data'] can also be of type true; however, parameter $contents of Illuminate\Filesystem\FilesystemAdapter::put() does only seem to accept resource|string, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 94 | $urls[] = [ |
||||
| 95 | 'url' => Storage::disk(config('light.neditor.disk'))->url($path), |
||||
| 96 | 'source' => $v, |
||||
| 97 | 'state' => 'SUCCESS' |
||||
| 98 | ]; |
||||
| 99 | } |
||||
| 100 | |||||
| 101 | return [ |
||||
| 102 | 'list' => $urls |
||||
| 103 | ]; |
||||
| 104 | } |
||||
| 105 | |||||
| 106 | public function uploadVideo(Request $request) |
||||
| 107 | { |
||||
| 108 | if (config('light.image_upload.driver') !== 'local') { |
||||
| 109 | $class = config('light.image_upload.class'); |
||||
| 110 | return call_user_func([new $class, 'uploadImage'], $request); |
||||
| 111 | } |
||||
| 112 | |||||
| 113 | if (!$request->hasFile('file')) { |
||||
| 114 | return [ |
||||
| 115 | 'code' => 2, |
||||
| 116 | 'msg' => '非法请求' |
||||
| 117 | ]; |
||||
| 118 | } |
||||
| 119 | $file = $request->file('file'); |
||||
| 120 | if (!$this->isValidVideo($file)) { |
||||
|
0 ignored issues
–
show
It seems like
$file can also be of type Illuminate\Http\UploadedFile[] and array and null; however, parameter $file of App\Http\Controllers\Adm...troller::isValidVideo() does only seem to accept Illuminate\Http\UploadedFile, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 121 | return [ |
||||
| 122 | 'code' => 3, |
||||
| 123 | 'msg' => '文件不合要求' |
||||
| 124 | ]; |
||||
| 125 | } |
||||
| 126 | |||||
| 127 | $result = $file->store('video/' . date('Ym'), config('light.neditor.disk')); |
||||
| 128 | if (!$result) { |
||||
| 129 | return [ |
||||
| 130 | 'code' => 3, |
||||
| 131 | 'msg' => '上传失败' |
||||
| 132 | ]; |
||||
| 133 | } |
||||
| 134 | |||||
| 135 | return [ |
||||
| 136 | 'code' => 200, |
||||
| 137 | 'state' => 'SUCCESS', // 兼容ueditor |
||||
| 138 | 'msg' => '', |
||||
| 139 | 'url' => Storage::disk(config('light.neditor.disk'))->url($result), |
||||
| 140 | ]; |
||||
| 141 | } |
||||
| 142 | |||||
| 143 | public function uploadFile(Request $request) |
||||
| 144 | { |
||||
| 145 | if (config('light.image_upload.driver') !== 'local') { |
||||
| 146 | $class = config('light.image_upload.class'); |
||||
| 147 | return call_user_func([new $class, 'uploadImage'], $request); |
||||
| 148 | } |
||||
| 149 | |||||
| 150 | if (!$request->hasFile('file')) { |
||||
| 151 | return [ |
||||
| 152 | 'code' => 2, |
||||
| 153 | 'msg' => '非法请求' |
||||
| 154 | ]; |
||||
| 155 | } |
||||
| 156 | $file = $request->file('file'); |
||||
| 157 | if (!$this->isValidFile($file)) { |
||||
|
0 ignored issues
–
show
It seems like
$file can also be of type Illuminate\Http\UploadedFile[] and array and null; however, parameter $file of App\Http\Controllers\Adm...ntroller::isValidFile() does only seem to accept Illuminate\Http\UploadedFile, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 158 | return [ |
||||
| 159 | 'code' => 3, |
||||
| 160 | 'msg' => '文件不合要求' |
||||
| 161 | ]; |
||||
| 162 | } |
||||
| 163 | |||||
| 164 | $result = $file->store('file/' . date('Ym'), config('light.neditor.disk')); |
||||
| 165 | if (!$result) { |
||||
| 166 | return [ |
||||
| 167 | 'code' => 3, |
||||
| 168 | 'msg' => '上传失败' |
||||
| 169 | ]; |
||||
| 170 | } |
||||
| 171 | |||||
| 172 | return [ |
||||
| 173 | 'code' => 200, |
||||
| 174 | 'state' => 'SUCCESS', // 兼容ueditor |
||||
| 175 | 'msg' => '', |
||||
| 176 | 'url' => Storage::disk(config('light.neditor.disk'))->url($result), |
||||
| 177 | ]; |
||||
| 178 | } |
||||
| 179 | |||||
| 180 | protected function isValidImage(UploadedFile $file) |
||||
| 181 | { |
||||
| 182 | $c = config('light.neditor.upload'); |
||||
| 183 | $config = [ |
||||
| 184 | 'maxSize' => $c['imageMaxSize'], |
||||
| 185 | 'AllowFiles' => $c['imageAllowFiles'], |
||||
| 186 | ]; |
||||
| 187 | |||||
| 188 | return $this->isValidUploadedFile($file, $config); |
||||
| 189 | } |
||||
| 190 | |||||
| 191 | protected function isValidVideo(UploadedFile $file) |
||||
| 192 | { |
||||
| 193 | $c = config('light.neditor.upload'); |
||||
| 194 | $config = [ |
||||
| 195 | 'maxSize' => $c['videoMaxSize'], |
||||
| 196 | 'AllowFiles' => $c['videoAllowFiles'], |
||||
| 197 | ]; |
||||
| 198 | |||||
| 199 | return $this->isValidUploadedFile($file, $config); |
||||
| 200 | } |
||||
| 201 | |||||
| 202 | protected function isValidFile(UploadedFile $file) |
||||
| 203 | { |
||||
| 204 | $c = config('light.neditor.upload'); |
||||
| 205 | $config = [ |
||||
| 206 | 'maxSize' => $c['fileMaxSize'], |
||||
| 207 | 'AllowFiles' => $c['fileAllowFiles'], |
||||
| 208 | ]; |
||||
| 209 | |||||
| 210 | return $this->isValidUploadedFile($file, $config); |
||||
| 211 | } |
||||
| 212 | |||||
| 213 | protected function isValidUploadedFile(UploadedFile $file, array $config) |
||||
| 214 | { |
||||
| 215 | if (!$file->isValid() || |
||||
| 216 | $file->getSize() > $config['maxSize'] || |
||||
| 217 | !in_array( |
||||
| 218 | '.' . strtolower($file->getClientOriginalExtension()), |
||||
| 219 | $config['AllowFiles'] |
||||
| 220 | ) || |
||||
| 221 | !in_array( |
||||
| 222 | '.' . strtolower($file->guessExtension()), |
||||
|
0 ignored issues
–
show
It seems like
$file->guessExtension() can also be of type null; however, parameter $string of strtolower() does only seem to accept string, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 223 | $config['AllowFiles'] |
||||
| 224 | ) |
||||
| 225 | ) { |
||||
| 226 | return false; |
||||
| 227 | } |
||||
| 228 | |||||
| 229 | return true; |
||||
| 230 | } |
||||
| 231 | |||||
| 232 | protected function fetchImageFile($url) |
||||
| 233 | { |
||||
| 234 | try { |
||||
| 235 | if (!filter_var($url, FILTER_VALIDATE_URL)) { |
||||
| 236 | return false; |
||||
| 237 | } |
||||
| 238 | |||||
| 239 | $ch = curl_init(); |
||||
| 240 | $options = [ |
||||
| 241 | CURLOPT_URL => $url, |
||||
| 242 | CURLOPT_RETURNTRANSFER => true, |
||||
| 243 | CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.2 (KHTML, like Gecko) Chrome/22.0.1216.0 Safari/537.2' |
||||
| 244 | ]; |
||||
| 245 | curl_setopt_array($ch, $options); |
||||
| 246 | $data = curl_exec($ch); |
||||
| 247 | curl_close($ch); |
||||
| 248 | if (!$data) { |
||||
| 249 | return false; |
||||
| 250 | } |
||||
| 251 | |||||
| 252 | if (isWebp($data)) { |
||||
| 253 | $image = Image::make(imagecreatefromwebp($url)); |
||||
| 254 | $extension = 'webp'; |
||||
| 255 | } else { |
||||
| 256 | $resource = @imagecreatefromstring($data); |
||||
|
0 ignored issues
–
show
It seems like
$data can also be of type true; however, parameter $image of imagecreatefromstring() does only seem to accept string, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 257 | |||||
| 258 | if ($resource === false) { |
||||
| 259 | throw new NotReadableException( |
||||
| 260 | "Unable to init from given binary data." |
||||
| 261 | ); |
||||
| 262 | } |
||||
| 263 | $image = Image::make($resource); |
||||
| 264 | $image->mime = finfo_buffer(finfo_open(FILEINFO_MIME_TYPE), $data); |
||||
|
0 ignored issues
–
show
It seems like
$data can also be of type true; however, parameter $string of finfo_buffer() does only seem to accept string, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 265 | } |
||||
| 266 | } catch (NotReadableException $e) { |
||||
| 267 | return false; |
||||
| 268 | } |
||||
| 269 | |||||
| 270 | $mime = $image->mime(); |
||||
| 271 | return [ |
||||
| 272 | 'extension' => $extension ?? ($mime ? strtolower(explode('/', $mime)[1]) : ''), |
||||
| 273 | 'data' => $data |
||||
| 274 | ]; |
||||
| 275 | } |
||||
| 276 | |||||
| 277 | protected function isAllowedImageType($extension) |
||||
| 278 | { |
||||
| 279 | $c = config('light.neditor.upload'); |
||||
| 280 | |||||
| 281 | return in_array('.' . $extension, $c['imageAllowFiles'], true); |
||||
| 282 | } |
||||
| 283 | } |
||||
| 284 |