2017-03-10 37 views
1

我遇到了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=-1webmvc.multipart.maxUploadSize=-1,但是當我上傳大於5MB的東西時,這個行爲就會產生。

+0

有任何堆棧跟蹤你的日誌? – reos

+0

顯示的堆棧跟蹤是針對'FileUploadBase.SizeLimitExceededException'異常的異常,這是一個在循環中捕獲的異常。我現在沒有它,但它描述了一個錯誤,如「你的文件大小是N字節,允許的最大值是X字節(N大於X)」 – maqjav

回答

0

我認爲你需要爲MaxUploadSizeExceededException

@ExceptionHandler(MaxUploadSizeExceededException.class) 
    public String handleError(MaxUploadSizeExceededException e, RedirectAttributes redirectAttributes) { 
     ....... 
    } 

的異常處理程序,您可以看到更多的在這裏

https://www.mkyong.com/spring/spring-mvc-how-to-handle-max-upload-size-exceeded-exception/

+0

引發的異常不是那個,是'FileUploadBase .SizeLimitExceededException「女巫就像我說的,被一次又一次地捕獲。這裏的問題是循環行爲,而不是捕捉異常。 – maqjav