user(); if (! $user instanceof WechatUser) { abort(403, '仅微信用户可上传'); } if ($early = $this->ensurePublicDiskReady()) { return $early; } if (!$request->hasFile('file')) { return response()->json(['message' => '未收到文件'], 422); } $uploaded = $request->file('file'); if (!$uploaded->isValid()) { return response()->json(['message' => $uploaded->getErrorMessage()], 422); } $data = $request->validate([ // mimes 内部用 guessExtension(),依赖 fileinfo;extensions 仅看客户端扩展名 'file' => ['required', 'file', 'max:5120', 'extensions:jpg,jpeg,png,gif,webp'], ]); try { $path = $this->storeUploadedFileAsUniqueName($data['file'], 'uploads/h5'); } catch (Throwable $e) { report($e); Log::error('h5_upload_putfile_failed', [ 'message' => $e->getMessage(), 'public_path' => storage_path('app/public'), ]); return response()->json([ 'message' => '文件保存失败', 'detail' => config('app.debug') ? $e->getMessage() : null, ], 500); } if ($path === false) { Log::error('h5_upload_putfile_returned_false', [ 'public_path' => storage_path('app/public'), ]); return response()->json([ 'message' => '文件保存失败(写入返回失败)', 'detail' => config('app.debug') ? 'Storage::putFileAs 返回 false' : null, ], 500); } $safePath = str_replace('\\', '/', $path); return response()->json([ 'url' => url('/storage/'.$safePath), 'path' => $path, ]); } }