Grails 4上传大文件触发SizeLimitExceededException问题求助
解决Grails 4文件上传SizeLimitExceededException的问题
我来帮你搞定这个文件上传大小限制的问题!你遇到的org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException,大概率是因为几个容易忽略的配置点没覆盖到,咱们一步步来排查:
1. 确认Grails配置的层级是否正确
首先检查你的application.yml里,上传配置是不是放在grails节点下面?很多人容易漏了这个层级,导致配置根本没生效。正确的结构应该是:
grails: controllers: defaultScope: singleton upload: maxFileSize: 26214400 # 25MB maxRequestSize: 26214400
2. 配置嵌入式Tomcat的全局限制
Grails 4默认用嵌入式Tomcat,它本身也有请求大小的限制,会优先于Grails的配置生效。你需要在application.yml里添加Tomcat的相关配置:
server: tomcat: max-http-form-post-size: 26214400 # 和maxRequestSize保持一致 max-swallow-size: -1 # 禁用Tomcat自动截断大请求的行为,避免提前抛异常 connection-timeout: 60000 # 可选,延长超时时间防止大文件上传超时
3. 确保自定义MultipartResolver被正确注册
你写了CustomMultipartResolver,但Grails默认不会自动使用它,得手动在grails-app/conf/spring/resources.groovy里注册这个Bean:
beans = { multipartResolver(CustomMultipartResolver) { maxUploadSize = 26214400 # 全局请求大小限制 maxUploadSizePerFile = 26214400 # 单个文件大小限制 } }
这样Grails才会用你的自定义Resolver来处理文件上传,异常捕获逻辑才能生效。
4. 优化自定义Resolver的异常捕获逻辑
建议你把异常捕获更精准一些,只处理SizeLimitExceededException,避免误捕获其他Multipart异常:
import org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException; class CustomMultipartResolver extends StandardServletMultipartResolver { static final String FILE_SIZE_EXCEEDED_ERROR = "fileSizeExceeded"; @Override MultipartHttpServletRequest resolveMultipart(HttpServletRequest request) throws MultipartException { try { return super.resolveMultipart(request); } catch (SizeLimitExceededException e) { log.error("文件大小超过限制:{}", e.getMessage()) request.setAttribute(FILE_SIZE_EXCEEDED_ERROR, true); return new DefaultMultipartHttpServletRequest(request, new LinkedMultiValueMap<>(), new LinkedHashMap<>(), new LinkedHashMap<>()); } } }
5. 检查是否有前置过滤器拦截请求
如果你的项目里有安全过滤器(比如Spring Security)或者自定义过滤器,有些过滤器会在MultipartResolver之前就检查请求大小,这时候需要在过滤器配置里同步调整允许的最大请求大小。
按照上面的步骤调整后,重启项目再测试大文件上传,应该就能解决问题了!
内容的提问来源于stack exchange,提问作者Lastone
相关产品推荐
相关产品推荐

