springboot项目部署到Tomcat上传文件过大无响应问题

doMore 1,893 2020-03-18

参考文档: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);
	}
// 将拦截器设置为最高优先级。

到这里就绝对能够捕捉异常,正常返回结果。