在web項目中,經常會遇到上傳文件的需求,有時需要單個上傳,有時需要批量上傳。默認情況下,支持文件的大小是1M。當默認配置不符合業(yè)務需求時,需要我們調整支持文件上傳大小的限制。若上傳文件大小超過支持的大小,后臺會拋出異常。本文主要基于springboot講解如何配置支持文件的大小,并且對于超過大小時異常如何處理。
上傳文件的請求提交到服務器之后,首先請求會交由SpringMVC的DispatcherServlet進行處理,調用該方法的doService方法進行請求處理;當收到請求時 DispatcherServlet 的 checkMultipart() 方法會調用 ultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件。如果請求數(shù)據(jù)中包含文件,則調用 MultipartResolver 的resolveMultipart() 方法對請求的數(shù)據(jù)進行解析,然后將文件數(shù)據(jù)解析成 MultipartFile 并封裝在MultipartHttpServletRequest (繼承了 HttpServletRequest) 對象中,最后傳遞給 Controller。
resolveMultipart方法處理邏輯包含了對文件大小限制的判斷,如果超過大小會拋出異常。

代碼中,F(xiàn)ileUpload類中的sizeMax和fileSizeMax的值來自于MultipartConfigElement類中的屬性。也即在springboot中通過配置MultipartConfigElement類,來配置文件的大小。
1.后臺配置支持文件大小的方式
1.1配置文件配置
spring.servlet.multipart.maxFileSize=100MB
spring.servlet.multipart.max-request-size=1024MB
1.2Bean方式配置
@Configuration
public class UploadConfig {
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
//單個文件最大
factory.setMaxFileSize("20480KB"); //KB,MB
/// 設置總上傳數(shù)據(jù)總大小
factory.setMaxRequestSize("1024000KB");
return factory.createMultipartConfig();
}
}
2.上傳文件超過指定大小的異常處理
如果文件超過設定的大小,后臺會拋出MultipartException異常,F(xiàn)ileSizeLimitExceededException、SizeLimitExceededException均是改異常的子類。為了能給用戶友好的提示,我們需要對該異常進行處理,提示出系統(tǒng)支持文件的大小。
下面使用SpringBoot中統(tǒng)一異常處理的思路進行處理。
2.1配置Tomcat的MaxSwallowSize
//配置tomcat,使的上傳文件超過設置的值時,進行提醒。
@Bean
public ServletWebServerFactory tomcatEmbedded() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
((AbstractHttp11Protocol<?>)
connector.getProtocolHandler()).setMaxSwallowSize(-1);
}
});
return tomcat;
}
maxSwallowSize配置用于配置上載的字節(jié)數(shù),默認為2M。如果您嘗試上傳的文件大小超出了大小限制,則Tomcat會將其裁剪為默認的2mb并重置連接。
將maxSwallowSize設置為-1表示無限制。
----------------------對maxSwallowSize參數(shù)還需要進一步理解----------------------------
2.2統(tǒng)一異常配置
@ControllerAdvice
public class BaseController{
private final static Logger LOGGER = LoggerFactory.getLogger(BaseController.class);
@Autowired
MultipartConfigElement fileSizeConfig ;
@ExceptionHandler(value = MultipartException.class)
@ResponseBody
public String fileUploadExceptionHandler(MultipartException exception, HttpServletResponse response) {
String msg="";
Throwable rootCase=exception.getRootCause();
if (rootCase instanceof FileSizeLimitExceededException) {//單個文件超過大小
msg="單文件大小不得超過"+fileSizeConfig.getMaxFileSize()/1024/1024+"M";
}else if(rootCase instanceof SizeLimitExceededException){//總文件超過大小
msg="總文件大小不得超過"+fileSizeConfig.getMaxRequestSize()/1024/1024+"M";
}else {
msg="上傳失敗[服務器異常]";
}
LOGGER.error(msg, exception);
return ResultStandardUtil.importingFailMessage(msg);
}
}
其中MultipartConfigElement類可以獲取到配置支持文件的大小。可以返回前端;
FileSizeLimitExceededException代表單個文件超過支持的大??;
SizeLimitExceededException代表所有文件超過支持的大??;
ResultStandardUtil.importingFailMessage(msg); 是約定返回格式的封裝。
這樣,當上傳的文件超過指定的大小時,就能夠將異常信息友好的返回給前端頁面進行提示!
注意:該方式在Springboot2.0.5版本下測試可用,2.3版本不可用