1、前言
- 此文章记录Spring Boot2.x以上版本的
上传文件统一处理文件过大问题
进行做笔录。 - 此文章记录提出解决Spring Boot2x与undertow服务器上
统一处理文件过大问题
解决思路 - 通过查找各种资料足以证明,SpringBoot2.x与Tomcat更为说服力,详细请认真看文章,希望文章对你有所获.
2、解决的思路
-
【第1种】解决的思路
配置springboot2.x文件上传,max-file-size,max-request-size参数
把undertow服务器改成Tomcat,在一个类统一处理捕获上传文件控制文件最大限制,然后进行拦截抛异常编码和提示返回给前端。
-
【第2种】解决的思路
重写 undertow容器的io.undertow包的UndertowMessages_bundle_zh_CN、然后在自个工程新建一个io.undertow然后进行修改 private static final String maxFileSizeExceeded = "UT000054: 上传的单个文件大小不能超过%sMB";
- 在Springboot的入口类加上支持国际化设置,经过本人测试超过设置最大请求值的时候
spring.servlet.multipart.max-request-size
,此时也无法返回自定义的code
与msg
报错点:{"timestamp":"2019-06-04 16:09:53","status":500,"error":"Internal Server Error","message":"io.undertow.server.handlers.form.MultiPartParserDefinition$FileTooLargeException: UT000054: 上传的单个文件大小不能超过10MB","path":"/rest/importData"}
- 支持编码国际化设置
Locale.setDefault(Locale.SIMPLIFIED_CHINESE);
-
异常还是无法解决统一拦截处理。
3、建议方案
1、建议使用SpringBoot2.x的内置Tomcat,去除使用undertow容器的大坑问题。原因这个问题影响整个项目导入文件过大的问题进行统一拦截控制,如果不改成Tomcat服务器运行,后端无法统一捕获文件上传过大的异常。
在对undertow它不了解的情况下,可以考虑前端进行控制,如果改成前端处理不是不可以,只是不够严谨,而且从根本上解决不了问题所在
。2、不建议使用undertow,undertow是Redhat的产品,而Redhat又IBM给收购了
经过各种折腾的排除问题,尝试各种谷歌搜索的文章,个人认为undertow不是一个好东西,原因:undertow网上的解决方案文章非常少,而且Tomcat不用就是找坑,Tomcat起码经得起市场的考验,可以说半壁江山的WEB服务应用都Run在Tomcat上。
4、找到问题所在根源
- 排除tomcat依赖使用undertow容器的大坑问题所在pom.xml配置
- 异常信息为:java.lang.IllegalStateException: io.undertow.server.handlers.form.MultiPartParserDefinition$FileTooLargeException: UT000054: The maximum size 10485760 for an individual file in a multipart request was exceeded larger than 10485760
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--排除(去除)tomcat依赖-->
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<!--undertow容器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
5、Springboot2.x文件上传配置参数
spring.servlet.multipart.enabled=true # 是否支持多部分上传。
spring.servlet.multipart.max-file-size=1MB # 最大支持文件上传的大小
spring.servlet.multipart.max-request-size=10MB # 支持请求最大文件上传的大小
6、 undertow容器的大坑异常SpringBoot无法捕获异常处理
- 干掉maven的pom.xml的undertow配置,使用spring-boot-starter-web的内置Tomcat
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
7、新建一个类统一处理拦截异常
- 在一个类统一处理捕获上传文件控制文件最大限制,然后进行拦截抛异常编码和提示返回给前端。
/**
* 全局异常处理器
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandlerResolver {
/**
* @Descript 统一处理文件过大问题.
*/
@ExceptionHandler(MaxUploadSizeExceededException.class)
public R handleMaxUploadSizeExceededException(MaxUploadSizeExceededException e) {
log.error("上传文件过大 ex={}", e);
return retMsgCode("上传文件过大", 9999);
}
}
8、SpringBoot2.x文档
- SpringBoot2.x文档
- 通过官方文档上面看也没看出Undertow与SpringBoot整合有很好的优势.反而找到它说不支持jsp
Undertow does not support JSPs.
- 从Undertow 1.4.0+开始,支持HTTP/2,而不需要在JDK8上附加任何要求
As of Undertow 1.4.0+, HTTP/2 is supported without any additional requirement on JDK8.
- 可以启用多个文件监听
Enable Multiple Listeners with Undertow
9、推荐了解的文章
- 个人不建议看此文章写得有多好,数据测试数据。
- Spring Boot 内嵌容器Undertow参数设置
10、Undertow官方
Undertow是一个用java编写的灵活的高性能web服务器,提供基于NIO的阻塞和非阻塞API。
Undertow具有基于组合的体系结构,允许您通过组合小型的单一用途处理程序来构建web服务器。它使您可以灵活地选择是使用完整的Java EE servlet 4.0容器,还是使用低级的非阻塞处理程序,还是使用两者之间的任何东西。Undertow被设计为完全可嵌入的,易于使用fluent builder api。Undertow的生命周期完全由嵌入应用程序控制。Undertow由JBoss赞助,是Wildfly应用程序服务器中的默认web服务器。
10、个人感想与疑问
- undertow服务器真的在市场大量使用了?
- 使用undertow服务器能不能解决未预知的问题呢?
- 当遇到问题能不能搜索资料来处理问题呢?
- 当团队中遇到问题能不能快速定位排除问题进行处理掉呢?
-
如果没有很好的案例实战过与经过市场的考验,请不要给网上这些所谓的测试数据给蒙蔽,一句话好奇会害死猫