uploadType = $upload_type; } public function validate(File $file, $allow_ext = null, $allow_size = null, $fail_exception = false) { $uploadConfig = sysconfig('upload'); if (!is_null($allow_ext)) { $uploadConfig['upload_allow_ext'] = $allow_ext; } if (!is_null($allow_size)) { $uploadConfig['upload_allow_size'] = $allow_size; } $rule = [ 'upload_type|指定上传类型有误' => "in:{$uploadConfig['upload_allow_type']}", 'file|文件' => "require|file|fileExt:{$uploadConfig['upload_allow_ext']}|fileSize:{$uploadConfig['upload_allow_size']}", ]; $validat_result = Validate::failException($fail_exception)->check([ 'upload_type' => $this->uploadType, 'file' => $file, ], $rule); if (!$validat_result) { return $validat_result; } // 出于性能原因,您可以注释掉下面的代码 $file_path = $file->getRealPath(); if (strpos(file_get_contents($file_path), 'validate($file, $allow_ext, $allow_size, true); } public function url($save_name) { $url = Filesystem::disk($this->uploadType)->url($save_name); return $url; } /** * 存储文件. * * @param File $file * @param string|null $save_name * @param bool $force_save 指定$save_name才可以用,设为true强制写入(不报错,如果存在则删除),否则是驱动的默认行为(覆盖、失败、异常) * @param string $upload_dir * @param bool $disable_model * @return mixed */ public function save(File $file, string $save_name = null, $force_save = false, $upload_dir = 'upload', $disable_model = false) { $model_file = null; if ($force_save && !is_null($save_name)) { $file_path = $upload_dir . '/' . $save_name; if (Filesystem::disk($this->uploadType)->has($file_path)) { $model_file = SystemUploadfile::where('save_name', $save_name)->where('upload_type', $this->uploadType)->find(); Filesystem::disk($this->uploadType)->delete($file_path); } } if (empty($model_file)) { $model_file = new SystemUploadfile(); } $model_file->upload_type = $this->uploadType; $model_file->file_ext = strtolower($file->extension()); if ($file instanceof UploadedFile) { $model_file->original_name = $file->getOriginalName(); $model_file->mime_type = $file->getOriginalMime(); } else { $model_file->original_name = $file->getFilename(); $model_file->mime_type = $file->getMime(); } try { $save_name = Filesystem::disk($this->uploadType)->putFile($upload_dir, $file, function () use ($save_name, $file) { if (!is_null($save_name)) { $ext_name = $file->extension(); if (empty($ext_name)) { return $save_name; } $list_name = explode('.', $save_name); array_pop($list_name); return implode('.', $list_name); } return date('Ymd') . '/' . uniqid(); }); } catch (\Throwable $e) { throw new \Exception('文件上传失败:' . $e->getMessage()); } if ($save_name === false) { throw new \Exception('文件上传失败:存储写入失败'); } $url = $this->url($save_name); $model_file->url = $url; $model_file->save_name = $save_name; $model_file->sha1 = $file->sha1(); $model_file->file_size = $file->getSize(); if (!$disable_model) { $model_file->save(); } return $model_file; } public function saveUrlFile($url, string $save_name = null, $force_save = false, $upload_dir = 'upload', $disable_model = false) { $runtime_path = App::getRuntimePath() . 'upload/temp/' . basename($url); PathTools::intiDir($runtime_path); $file_content = file_get_contents($url); file_put_contents($runtime_path, $file_content); $file = new File($runtime_path); $response = $this->save($file, $save_name, $force_save, $upload_dir, $disable_model); unlink($runtime_path); return $response; } public function delete($save_name) { return Filesystem::disk($this->uploadType)->delete($save_name); } }