1. 概述
在 Spring 框架中,當應用程序嘗試上傳一個大小超過配置中指定閾值的文件時,會拋出 <em>MaxUploadSizeExceededException</em> 異常。
在本教程中,我們將瞭解如何指定最大上傳大小。然後,我們將展示一個簡單的文件上傳控制器,並討論處理該異常的不同方法。
2. 設置最大上傳文件大小
默認情況下,上傳文件的大小沒有限制。為了設置最大上傳文件大小,您需要聲明一個類型為 MultipartResolver 的 Bean。
下面是一個限制文件大小為 5MB 的示例:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver
= new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(5242880);
return multipartResolver;
}3. File Upload Controller
接下來,我們定義一個處理文件上傳和保存到服務器的方法:
@RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
public ModelAndView uploadFile(MultipartFile file) throws IOException {
ModelAndView modelAndView = new ModelAndView("file");
InputStream in = file.getInputStream();
File currDir = new File(".");
String path = currDir.getAbsolutePath();
FileOutputStream f = new FileOutputStream(
path.substring(0, path.length()-1)+ file.getOriginalFilename());
int ch = 0;
while ((ch = in.read()) != -1) {
f.write(ch);
}
f.flush();
f.close();
modelAndView.getModel().put("message", "File uploaded successfully!");
return modelAndView;
}如果用户嘗試上傳大於 5MB 的文件,應用程序將拋出 MaxUploadSizeExceededException 類型的異常。
4. 處理 <em MaxUploadSizeExceededException>
為了處理此異常,我們可以讓我們的控制器實現 <em HandlerExceptionResolver 接口,或者創建一個帶有 <em @ControllerAdvice 註解的類。
4.1. 實現 HandlerExceptionResolver</h3
HandlerExceptionResolver接口聲明瞭一個名為resolveException()的方法,該方法可以處理不同類型的異常。
讓我們重寫resolveException()方法,以便在捕獲的異常類型為MaxUploadSizeExceededException時顯示一條消息:
@Override
public ModelAndView resolveException(
HttpServletRequest request,
HttpServletResponse response,
Object object,
Exception exc) {
ModelAndView modelAndView = new ModelAndView("file");
if (exc instanceof MaxUploadSizeExceededException) {
modelAndView.getModel().put("message", "File size exceeds limit!");
}
return modelAndView;
}4.2. 創建 Controller 建議攔截器
通過攔截器處理異常,而不是直接在控制器中處理,具有幾個優勢。首先,我們可以將相同的異常處理邏輯應用於多個控制器。
其次,我們可以創建一個方法,僅針對我們想要處理的異常進行處理,從而允許框架在不使用 instanceof 檢查異常類型的情況下委託異常處理。
@ControllerAdvice
public class FileUploadExceptionAdvice {
@ExceptionHandler(MaxUploadSizeExceededException.class)
public ModelAndView handleMaxSizeException(
MaxUploadSizeExceededException exc,
HttpServletRequest request,
HttpServletResponse response) {
ModelAndView modelAndView = new ModelAndView("file");
modelAndView.getModel().put("message", "File too large!");
return modelAndView;
}
}5. Tomcat 配置
如果您正在部署到 Tomcat 服務器版本 7 及更高版本,您可能需要設置或更改一個配置屬性,即 maxSwallowSize。
此屬性指定 Tomcat 將“吞噬”從客户端上傳的最多字節數,當 Tomcat 知道服務器將忽略文件時。
該屬性的默認值為 2097152 (2 MB)。如果未更改或設置為低於我們 MultipartResolver 中設置的 5 MB 限制,Tomcat 將拒絕任何嘗試上傳大於 2 MB 的文件,並且我們的自定義異常處理將不會被調用。
為了使請求成功並顯示應用程序的錯誤消息,您需要將 maxSwallowSize 屬性設置為負值。這會指示 Tomcat 無論文件大小如何,都吞噬所有失敗的上傳。
這將在 TOMCAT_HOME/conf/server.xml 文件中完成:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxSwallowSize = "-1"/>6. 結論
在本文中,我們演示瞭如何在 Spring 中配置最大文件上傳大小,以及如何處理當客户端嘗試上傳超過此限制大小的文件時產生的 <em >MaxUploadSizeExceededException</em> 異常。