我遇到了Spring處理fileupload異常的問題。與Spring 4處理FileUploadBase.SizeLimitExceededException
我的下一個multipartResolver:
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
commonsMultipartResolver.setDefaultEncoding(this.defaultEncoding);
commonsMultipartResolver.setMaxInMemorySize(this.maxInMemorySize);
commonsMultipartResolver.setMaxUploadSize(this.maxUploadSize);
commonsMultipartResolver.setMaxUploadSizePerFile(this.maxUploadSizePerFile);
return commonsMultipartResolver;
}
隨着未來常數值:
webmvc.multipart.maxInMemorySize=10485760 //10MB
webmvc.multipart.maxUploadSize=10485760 //10MB
webmvc.multipart.maxUploadSizePerFile=5242880 //5MB
我的下一個GlobalExceptionHandler:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = MultipartException.class)
public String handleMultipartException(Exception ex, HttpServletRequest request) {
if (ex instanceof MultipartException) {
final MultipartException mEx = (MultipartException) ex;
if (ex.getCause() instanceof FileUploadBase.FileSizeLimitExceededException) {
final FileUploadBase.FileSizeLimitExceededException flEx = (FileUploadBase.FileSizeLimitExceededException) mEx.getCause();
request.setAttribute("size", flEx.getPermittedSize());
} else if (ex.getCause() instanceof FileUploadBase.SizeLimitExceededException) {
final FileUploadBase.SizeLimitExceededException flEx = (FileUploadBase.SizeLimitExceededException) mEx.getCause();
request.setAttribute("size", flEx.getPermittedSize());
} else {
request.setAttribute("error", ex.getMessage());
}
} else {
request.setAttribute("error", ex.getMessage());
}
return "forward:/errors.do";
}
}
如果我上傳下5MB文件一切工作正常,沒有例外激發和文件上傳正常。
如果我上傳5MB到10MB之間的文件,異常是由我GlobalExceptionHandler擦肩而過,結果在我的頁面顯示/錯誤
但是,如果我上傳超過10MB的文件時,我GlobalExceptionHandler捕捉異常並轉發到/ errors,但是!,那麼GlobalExceptionHandler再次捕獲異常,並一直執行直到時間結束。
如果我不懷疑,我的多部分內容似乎被CommonsMultipartResolver一遍又一遍地處理,即使在GlobalExceptionHandler捕獲到異常並嘗試轉發到一個完全不同的頁面(我嘗試使用重定向而不是轉發和問題仍然存在)。
爲什麼它在兩種情況下表現不一樣?我該如何解決這個問題?
我試着設置webmvc.multipart.maxInMemorySize=-1
和webmvc.multipart.maxUploadSize=-1
,但是當我上傳大於5MB的東西時,這個行爲就會產生。
有任何堆棧跟蹤你的日誌? – reos
顯示的堆棧跟蹤是針對'FileUploadBase.SizeLimitExceededException'異常的異常,這是一個在循環中捕獲的異常。我現在沒有它,但它描述了一個錯誤,如「你的文件大小是N字節,允許的最大值是X字節(N大於X)」 – maqjav