大部分時候,Web應用不允許浏覽者自由上傳,尤其不能允許上傳可執行性檔案——因為可能是病毒程式。通常,我們可以允許浏覽者上傳圖檔、上傳壓縮檔案等;除此之外,還必須對浏覽者上傳的檔案大小進行限制。是以必須在檔案上傳中進行檔案過濾。
從上面的Action中可以看出,Action内有兩個方法分别用于擷取檔案類型和檔案大小。為了實作檔案過濾,完全可以通過判斷這兩個方法的傳回值來實作檔案過濾。在這種方式下,程式員擷取全部的過濾控制權利。
如果需要手動實作檔案過濾,可按如下步驟進行。
在Action中定義一個專用于進行檔案過濾的方法,該方法的方法名字是任意的,該方法的邏輯就是判斷上傳檔案的類型是否為允許類型。例如增加filterTypes()方法,方法代碼如下。
程式清單:codes\04\4.3\codeFilter\WEB-INF\src\org\crazyit\app\action\UploadAction.java
/**
* 過濾檔案類型
* @param types 系統所有允許上傳的檔案類型
* @return 如果上傳檔案的檔案類型允許上傳,
* 傳回null,否則傳回error字元串
*/
public String filterTypes(String[] types)
{
//擷取希望上傳的檔案類型
String fileType = getUploadContentType();
for (String type : types)
{
if (type.equals(fileType))
{
return null;
}
}
return ERROR;
}
上面的方法判斷了上傳檔案的檔案類型是否在允許上傳檔案類型清單中。為了讓應用程式可以動态配置允許上傳的檔案清單,為該Action增加了一個allowTypes屬性,該屬性的值列出了所有允許上傳的檔案類型。為了可以在struts.xml檔案中配置allowTypes屬性的值,必須在Action類中提供如下代碼。
//定義該Action允許上傳的檔案類型
private String allowTypes;
//allowTypes屬性的setter和getter方法
public String getAllowTypes()
return allowTypes;
public void setAllowTypes(String allowTypes)
this.allowTypes = allowTypes;
(3)利用Struts 2的輸入校驗來判斷使用者輸入的檔案是否符合要求。如果不符合要求,接下來就将錯誤提示添加到FieldError中。該Action中增加的validate()方法代碼如下:
//執行輸入校驗
public void validate()
//将允許上傳檔案類型的字元串以英文逗号(,)
//分解成字元串數組進而判斷目前檔案類型是否允許上傳
String filterResult = filterType(getAllowTypes().split(","));
//如果目前檔案類型不允許上傳
if (filterResult != null)
//添加FieldError
addFieldError("upload" , "您要上傳的檔案類型不正确!");
上面的validate()方法的代碼非常簡單,它調用了filterTypes來判斷浏覽者所上傳的檔案是否符合要求,如果不是允許上傳的檔案類型,validate()方法就添加了FieldError,這樣Struts 2将自動傳回input邏輯視圖名;隻有當該檔案的類型是允許上傳的檔案類型時,才真正執行檔案上傳邏輯。
為了讓檔案類型檢驗失敗時能傳回input邏輯視圖,必須為該Action增加input邏輯視圖配置。經過上面的配置,當浏覽者上傳檔案類型為不允許類型時,系統将退回input邏輯視圖對應的頁面。
修改後的struts.xml檔案代碼如下。
程式清單:codes\04\4.3\codeFilter\WEB-INF\src\struts.xml
<!-- 配置處理檔案上傳的Action -->
<action name="uploadPro" class="org.crazyit.app.action.UploadAction">
<!-- 動态設定Action的屬性值 -->
<param name="savePath">/uploadFiles</param>
<!-- 設定允許上傳的檔案類型 -->
<param name="allowTypes">image/png,image/gif,image/jpeg</param>
<result name="input">/WEB-INF/content/upload.jsp</result>
<!-- 配置Struts 2預設的視圖頁面 -->
<result>/WEB-INF/content/succ.jsp</result>
</action>
為了在input.jsp頁面上顯示檔案過濾失敗的錯誤提示,可以在該頁面中使用如下代碼輸出錯誤提示。
<s:fielderror/>
實作檔案大小過濾,與實作檔案類型過濾的方法基本相似。雖然在上面的Action類中并沒有方法直接擷取上傳檔案的大小,但Action中包含了一個類型為File的屬性,該屬性封裝了檔案域對應的檔案内容;而File類有一個length()方法,該方法可以傳回檔案的大小,通過比較該檔案的大小和允許上傳的檔案大小,進而決定是否允許上傳該檔案。
提示:如果需要實作檔案大小的過濾,則可以調用File類的length()方法來擷取上傳檔案的大小,與允許上傳的檔案大小進行比較,進而決定是否允許上傳。
]