参考文档:https://blog.csdn.net/zhangfengwu2014/article/details/78093170
问题描述
用springboot做的一个ocr身份证识别功能,需要使用方将图片上传,本地开发的时候一切正常,部署到tomcat之后,上传图片过大,报错且无响应,统一异常处理也没有生效。
原因分析
1、tomcat对文件上传大小有限制
2、统一异常处理没有生效,可能不是在项目中抛出的异常,而是tomcat抛出的异常。
网上解决办法
修改tomcat\conf\server.xm下的Connector节点,增加maxPostSize=”0”,我试了一下不管用,可能是tomcat版本的原因。
本人解决办法
情况一:如果是在 springboot jar 项目中,配置上传文件解析器完成之后,需要设置tomcat上传文件限制的大小
server.tomcat.max_swallow_size: 10MB
# 当值为-1时不限制上传文件大小
注意:这一步非常重要
情况二: 如果是打成war之后运行,则需要修改tomcat的配置文件。
修改tomcat\conf\server.xm下的Connector节点,增加 maxSwallowSize=”-1” 的配置。再上传大文件的时候,服务端正确响应。
<Connector port="8080" protocol="HTTP/1.1"
maxSwallowSize="-1"
connectionTimeout="200000"
redirectPort="8443"/>
<!-- 猜测:jar包运行时使用的是springbot内置tomcat插件,打成war之后配置的
server.tomcat.max_swallow_size: 10MB 属性将不再生效,需要给外部tomcat增加配置完后才会生效 -->
<!-- 本处 tomcat 版本 8.5.14 -->
按着上述处理之后,统一异常处理还是不能处理抛出异常,接着看下面的方法。
创建一个拦截器控制上传大小,然后抛出同样的异常出来。
public class OcrFileInterceptor implements HandlerInterceptor {
private long maxSize;
public OcrFileInterceptor(long maxSize) {
this.maxSize = maxSize;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (request != null && ServletFileUpload.isMultipartContent(request)) {
ServletRequestContext context = new ServletRequestContext(request);
long requestSize = context.contentLength();
if (requestSize > maxSize) {
throw new MaxUploadSizeExceededException(maxSize);
}
}
return true;
}
将拦截器注册到mvc拦截器链中
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new OcrFileInterceptor(creditH5Properties.getOcrFileUploadSize()))
.addPathPatterns("/ocrPerson").order(Integer.MIN_VALUE);
}
// 将拦截器设置为最高优先级。