天天看點

Spring MVC環境中檔案上傳大小和檔案類型限制以及超大檔案上傳bug問題

      在上一篇文章中,主要介紹了Spirng MVC環境下的正常情況下檔案上傳功能實作。在實際開發的時候,還會涉及到上傳檔案大小和類型的限制,接下來就會對Spirng MVC環境下檔案上傳大小和類型的限制進行介紹,還會講解到檔案上傳大小tomcat伺服器bug問題及解決方案。

一、檔案上傳大小限制

  這裡還是接着上篇文章先介紹Spring MVC下的檔案上傳大小限制,檔案上傳大小的限制在springmvc-config.xml中配置檔案解析器CommonsMultipartResolver時即可配置,示例如下:

   關于Spring MVC中檔案上傳大小的限制就這麼簡單,問題是Spring MVC并沒有像Struts2那樣的配置,如果單純配置一個限制檔案上傳大小的配置,當超過上傳限制後就會出現異常:

Spring MVC環境中檔案上傳大小和檔案類型限制以及超大檔案上傳bug問題

  是以當在檔案解析器中配置了檔案大小的限制後,必須将抛出的MaxUploadSizeExceededException(上傳檔案過大異常)進行接收并跳轉。關于異常接收,在Spring MVC官方文檔中介紹了有3種方法,這裡主要介紹其中2種:

  (1)直接在配置檔案spring-config.xml中使用Spring MVC提供的SimpleMappingExceptionResolver(異常解析映射器)來接收異常資訊:

<a target="_blank"></a>

  這樣當再出現檔案上傳大小的異常時,配置檔案會自動捕獲異常并進行比對,比對到對應的MaxUploadSizeExceededException異常,就跳轉到指定的error.jsp錯誤頁面。

  (2)另一種就是自定義一個異常處理器類,可以比對接收各種異常,同時可以指定跳轉頁面以及錯誤提示資訊:

  上面自定的異常處理器類,模拟接收了抛出的MaxUploadSizeExceededException異常,完成自定義異常處理器類後,還必須進行在spring-config.xml配置檔案中配置:

    上面就介紹完了2種主要的Spring MVC中檔案上傳大小限制及異常捕獲的方案,讀者可以自行測試。

補充:檔案上傳大小限制tomcat伺服器bug問題

  在使用上述2種檔案上傳大小限制及異常捕獲配置後,當上傳檔案大小超過限制一定範圍後,可以正确捕獲異常并且跳轉到指定頁面,但是當上傳檔案超大(嚴重超出上傳大小限制)時,就可能出現關于MaxUploadSizeExceededException 死循環狀态,此時頁面直接崩潰。

     關于這個異常問題,在市面書籍、課程資料中都沒有提及這一點,都有意避之(因為開發中可能更多的使用插件進行檔案上傳和下載下傳,而不是用架構自帶的,另外這個bug問題目前也未能有效解決)。針對這個問題,查詢了官方文檔以及相關資料都沒有明确的解決方案和問題說明。不過在一篇老外的bug報告中提及到這個bug問題,可以參考連結:https://bz.apache.org/bugzilla/show_bug.cgi?id=57438;在文章中說明了這可能是tomcat伺服器的bug問題,而非Spring MVC架構問題,如果使用tomcat7.0.39版本的話,這個問題就不存在了。

     是以針對Spring MVC檔案上傳大小限制出現的這個問題,可以換用tomcat7.0.39版本的tomcat伺服器;或者使用另一種思路。

目前可行的解決方案:

    首先在配置檔案解析器時,不使用Spring MVC提供的檔案上傳大小限制屬性&lt;property name="maxUploadSize" value="5242880" /&gt;,示例如下:

  然後自定義一個攔截器來限定檔案上傳大小,并模拟抛出MaxUploadSizeExceededException異常:

  最後在spring-config.xml中配置攔截上傳大小限制的攔截器:

  這樣就可以完成在Spring MVC環境下檔案上傳大小的限制以及異常正确捕獲了。

二、檔案上傳類型的限制

  在這裡講解之前必須要聲明的是,在Spring MVC配置下,并沒有像Struts2配置檔案中那樣配置一個攔截器就可以同時限定上傳檔案大小和類型。同時在官方文檔以及其相關資料中也沒有提出在Spring MVC環境中限制檔案上傳類型的解決方案,不過這裡我們仍然可以使用自定義攔截器來限制檔案上傳類型。

  首先自定義一個檔案上傳類型限制的攔截器,示例如下:

  在上述示例中,自定義的攔截器限制了檔案上傳類型為:String suffixList = "jpg,gif,png,ico,bmp,jpeg";當攔截成功後會重回遠請求頁面,并攜帶錯誤資訊。

  然後在spring-config.xml中配置自定義攔截器,示例如下:

  完成上述步驟操作後,限制檔案上傳類型就完成了,讀者也可以自行測試。

轉載自:http://www.cnblogs.com/com-itheima-crazyStone/p/6807342.html