From 090cb65c0b4911ca99741661378c6abf2fffaeb0 Mon Sep 17 00:00:00 2001 From: ziin Date: Mon, 5 Jan 2026 20:26:37 +0800 Subject: [PATCH] =?UTF-8?q?fix(controller):=20=E4=BF=AE=E5=A4=8D=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8A=E4=BC=A0=E5=8F=82=E6=95=B0=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E4=B8=8E=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - FileController:把 @RequestParam 改成 @RequestPart 并去掉多余注解 - GlobalExceptionHandler:新增 MissingServletRequestPartException 拦截,返回 FILE_IS_EMPTY 错误码 - RequestBodyCacheFilter:跳过 multipart 请求,避免文件上传被缓存过滤器破坏 - UserServiceImpl:修正更新语句为 updateById,防止字段丢失 --- .../keyborad/controller/FileController.java | 3 +-- .../exception/GlobalExceptionHandler.java | 15 +++++++++++++++ .../filter/RequestBodyCacheFilter.java | 18 +++++++++++++++--- .../keyborad/service/impl/UserServiceImpl.java | 3 ++- 4 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/yolo/keyborad/controller/FileController.java b/src/main/java/com/yolo/keyborad/controller/FileController.java index dbdce1e..7fa1509 100644 --- a/src/main/java/com/yolo/keyborad/controller/FileController.java +++ b/src/main/java/com/yolo/keyborad/controller/FileController.java @@ -27,8 +27,7 @@ public class FileController { @PostMapping("/upload") @Operation(summary = "上传文件", description = "上传文件接口") - @Parameter(name = "file",required = true,description = "上传的文件") - public BaseResponse upload(@RequestParam("file") MultipartFile file){ + public BaseResponse upload(@RequestPart("file") MultipartFile file){ String fileUrl = fileService.upload(file); return ResultUtils.success(fileUrl); } diff --git a/src/main/java/com/yolo/keyborad/exception/GlobalExceptionHandler.java b/src/main/java/com/yolo/keyborad/exception/GlobalExceptionHandler.java index 8a66f3a..a1a404c 100644 --- a/src/main/java/com/yolo/keyborad/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/yolo/keyborad/exception/GlobalExceptionHandler.java @@ -9,6 +9,7 @@ import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.multipart.support.MissingServletRequestPartException; /** * 全局异常处理器 @@ -25,6 +26,20 @@ public class GlobalExceptionHandler { this.i18nService = i18nService; } + @ExceptionHandler(MissingServletRequestPartException.class) + public BaseResponse missingServletRequestPartExceptionHandler(MissingServletRequestPartException e, HttpServletRequest request) { + log.error("missingServletRequestPartException: " + e.getMessage(), e); + + String acceptLanguage = request.getHeader("Accept-Language"); + String errorMessage = i18nService.getMessageWithAcceptLanguage(String.valueOf(ErrorCode.FILE_IS_EMPTY.getCode()), acceptLanguage); + + if (errorMessage == null) { + errorMessage = ErrorCode.FILE_IS_EMPTY.getMessage(); + } + + return ResultUtils.error(ErrorCode.FILE_IS_EMPTY.getCode(), errorMessage); + } + @ExceptionHandler(BusinessException.class) public BaseResponse businessExceptionHandler(BusinessException e, HttpServletRequest request) { log.error("businessException: " + e.getMessage(), e); diff --git a/src/main/java/com/yolo/keyborad/filter/RequestBodyCacheFilter.java b/src/main/java/com/yolo/keyborad/filter/RequestBodyCacheFilter.java index 63539ad..f7cdb02 100644 --- a/src/main/java/com/yolo/keyborad/filter/RequestBodyCacheFilter.java +++ b/src/main/java/com/yolo/keyborad/filter/RequestBodyCacheFilter.java @@ -18,15 +18,27 @@ public class RequestBodyCacheFilter extends OncePerRequestFilter { FilterChain filterChain) throws ServletException, IOException { - // 只缓存一次 + // 获取请求的内容类型 + String contentType = request.getContentType(); + + // 跳过 multipart 请求,避免破坏文件上传功能 + if (contentType != null && contentType.toLowerCase().startsWith("multipart/")) { + // 对于文件上传请求,直接放行,不进行请求体缓存 + filterChain.doFilter(request, response); + return; + } + + // 检查是否已经进行过请求体缓存,避免重复缓存 if (!(request instanceof CachedBodyHttpServletRequest)) { - + // 创建缓存请求对象,包装原始请求以支持多次读取请求体 CachedBodyHttpServletRequest cachedRequest = new CachedBodyHttpServletRequest(request); - + + // 使用缓存的请求对象继续执行过滤器链 filterChain.doFilter(cachedRequest, response); return; } + // 如果已经是缓存过的请求,则直接执行过滤器链 filterChain.doFilter(request, response); } } diff --git a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java index f2e27fe..498ac94 100644 --- a/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java +++ b/src/main/java/com/yolo/keyborad/service/impl/UserServiceImpl.java @@ -191,7 +191,8 @@ public class UserServiceImpl extends ServiceImpl