利用Struts攔截器限制上傳圖片的格式和大小


在這之前

Struts的一個核心功能就是大量的攔截器,既然是框架,那么自然也就貼心地為我們准備好了各種常用的功能,比如這里即將討論的如何限制上傳圖片的格式和大小。那么既然是使用Struts已經寫好的攔截器,不需要我們去自定義了,那么這個攔截器的基本配置如何進行?在哪里進行配置?

以上,要弄懂基本原理的話,就要先了解Struts運行的大致流程。

Struts的運行大致流程

 
核心運行流程
Struts的啟動是依靠 StrutsPrepareAndExecuteFilter 過濾器來完成,當過濾器啟動時會執行其 init() 方法,它會去讀取Struts的配置信息,並將其封裝到JavaBean中,然后執行過濾器的 doFilter() 來解析地址,實例化Action並根據result進行頁面的跳轉。在Action的執行前后,會執行各類功能不同的攔截器。

用一張圖來說明以上的過程,就是:

很明顯,init() 中讀取的配置文件至關重要,這里有幾個核心文件被讀取,分別是 default.properties、struts-default.xml、struts-plugin.xml、struts.xml,並且按順序讀取,同樣的變量和配置項,后讀取的配置文件會覆蓋已讀取的配置文件。這也就是即使前幾個文件是Struts配置好的我們沒法改變,我們也依然可以通過在struts.xml中進行相關變量的配置來進行最終實現上的改變。

default.properties 中,定義了Struts中大量的常量,也就是許多設置的默認值。

而攔截器這部分的配置信息,在 struts-default.xml 中,它在 struts2-core-x.x.x 核心包的根目錄下,它不僅包含了大量bean的定義,還有大量的攔截器、攔截器棧,同時還定義了11種不同類型的頁面跳轉方式(result-type)等等。(這也就是我們的Action在配置時候總要extends struts-default.xml 的原因)

在struts-default.xml中,默認使用的是 defaultStack 這個攔截器棧,其中包含了一系列的攔截器(如下圖)
 
可以看到,fileUpload攔截器正是默認攔截器棧的一員,而我們,就要從這里入手,來實現我們對上傳圖片的限制功能。 


如何使用攔截器限制上傳圖片

我們先來看看源碼,在之前已經說過,fileUpload這個攔截器是我們默認攔截器棧中的一員,我們同樣在default-struts.xml中來找到該攔截器:
 
打開Struts文件上傳的攔截器org.apache.struts2.interceptor.FileUploadInterceptor,發現其包含三個重要屬性

它們分別表示的是:
  • 上傳文件的最大長度(單位為字節)(在default.properties我們可以查到struts.multipart.maxSize=2097152,即默認最大為2M大小的文件
  • 允許上傳文件的類型
  • 允許上傳文件的文件擴展名。

而之前我們提到的,這些默認的配置可以在struts.xml中將其默認值覆蓋,所以我們如果要限制上傳為jpg、png類型的最大為1M的圖片,那么:
(圖例為使用限制文件擴展名的方式) 

以上,叨叨了這么多,其實也就這么簡單的幾排,就完成了我們想要的功能。另外,還要提醒的是,雖然如此配置讓struts幫我們完成了對文件上傳的限制,但是假如我們上傳了不符合條件的文件,會發生什么?

答案是,系統會報錯,並 使Action自動直接返回 “input” ,所以不需要在action中的方法出現一個 return "input",同時,我們還要對返回的result name=“input” 進行配置,以便於即使上傳了不符的文件,頁面也能正常跳轉:
(圖例讓其跳轉到mainAction中執行 input() 方法) 

也可以參考如下方式:

至此,我們就對Struts攔截器完成圖片上傳限制的功能進行了了解和使用。


參考鏈接和源碼

參考鏈接

源碼地址
  • 源碼地址Github
  • 功能實現前,commit id:11e893eea4baea2683d6083368c758a3afe1a0bf
  • 功能實現后,commit id:2a6127d1d50eeeb98fa64e19b8d4321f9d61b360

附:struts.xml概述和配置文件的思維導圖
 



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM