| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 | <?phpnamespace App\Http\Controllers\admin;use App\Constants\HttpStatus;use App\Constants\Util;use App\Http\Controllers\Controller;use Illuminate\Support\Facades\Storage;use Illuminate\Validation\ValidationException;use Exception;class Upload extends Controller{    /**     * @api {post} /admin/upload/uploadFile 上传文件     * @apiGroup Upload     * @apiUse result     * @apiUse header     * @apiVersion 1.0.0     * @apiParam {File} image 图像文件的路径(本地路径)     * - 文件大小限制:最大 10MB。     * - 支持图像格式:`jpg`, `jpeg`, `png`,`webp`。     */    public function store()    {        try {            request()->validate([                'image' => ['required', 'image', 'mimes:jpg,jpeg,png,webp', 'max:10240'],            ]);            if (request()->hasFile('image')) {                $image = request()->file('image');                $imageName = md5_file($image->getRealPath());                if ($image->getClientOriginalExtension() == '') {                    $imageName .= '.webp';                } else {                    $imageName .= '.' . $image->getClientOriginalExtension();                }                $filePath = storage_path('app/public/images/' . $imageName);                if (!file_exists($filePath)) {                    $path = $image->storeAs('images', $imageName, 'public');                    $path = Storage::url($path);                } else {                    $path = Storage::url('images/' . $imageName);                }            } else {                throw new Exception('', HttpStatus::FILE_UPLOAD_ERROR);            }        } catch (ValidationException $e) {            return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first());        } catch (Exception $e) {            return $this->error($e->getCode());        }        return $this->success(['path' => Util::ensureUrl($path)]);    }    /**     * @api {post} /admin/upload/uploadVideo 上传视频     * @apiGroup Upload     * @apiUse result     * @apiUse header     * @apiVersion 1.0.0     * @apiParam {File} file 附件的路径(本地路径)     * - 文件大小限制:最大 50MB。     * - 支持视频格式:`mp4`,`mov`,`avi`,`webm`     */    public function video()    {        try {            request()->validate([                'file' => [                    'required',                    'file',                    'mimes:jpg,jpeg,png,webp,mp4,mov,avi,webm',                    'max:51200' // 最大 50MB,单位KB                ],            ]);            if (request()->hasFile('file')) {                $file = request()->file('file');                $fileName = md5_file($file->getRealPath());                // 获取原始扩展名                $extension = $file->getClientOriginalExtension();                $fileName .= $extension ? ('.' . $extension) : '';                // 根据类型判断存放目录(可选)                $isImage = in_array(strtolower($extension), ['jpg', 'jpeg', 'png', 'webp']);                $dir = $isImage ? 'images' : 'videos';                $filePath = storage_path("app/public/{$dir}/" . $fileName);                if (!file_exists($filePath)) {                    $path = $file->storeAs($dir, $fileName, 'public');                    $path = Storage::url($path);                } else {                    $path = Storage::url("{$dir}/" . $fileName);                }            } else {                throw new Exception('', HttpStatus::FILE_UPLOAD_ERROR);            }        } catch (ValidationException $e) {            return $this->error(HttpStatus::CUSTOM_ERROR, $e->validator->errors()->first());        } catch (Exception $e) {            return $this->error($e->getCode());        }        return $this->success(['path' => Util::ensureUrl($path)]);    }}
 |