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);
-
異常還是無法解決統一攔截處理。
異常.png
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服務器能不能解決未預知的問題呢?
- 當遇到問題能不能搜索資料來處理問題呢?
- 當團隊中遇到問題能不能快速定位排除問題進行處理掉呢?
-
如果沒有很好的案例實戰過與經過市場的考驗,請不要給網上這些所謂的測試數據給蒙蔽,一句話好奇會害死貓
作者:愛學習的蹭蹭
鏈接:https://www.jianshu.com/p/c171eed87f95
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。