使用Struts2控制文件下載

 

 

1 使用Struts2控制文件下載
可能不少人會以爲,文件下載太簡單,直接在頁面上給出一個超級連接,該連接的href屬性等於要下載文件的文件名,不就能夠實現文件下載了嗎?大 部分時候的確能夠實現文件下載,但若是該文件的文件名爲中文文件名,則會致使下載失敗;或者應用程序須要在讓用戶下載以前進行進一步檢查,好比判斷用戶是 否有足夠權限來下載該文件等。
看下面的一個原始的下載頁面代碼片斷:
apache

原始的下載



上面頁面的包含兩個下載的超級連接,兩個連接的資源都是存在的,但由於第一個資源文件的文件名是中文文件名,若是單擊第一個超級連接,將出現以下圖所示的頁面。
從圖中頁面中橢圓形框包圍的地方,咱們看到被下載的文件名變成了包含大量%的字符串,很明顯,這種文件名顯然沒法取得須要下載的文件。
爲了解決這個問題,咱們使用Struts2的文件下載支持來下載該文件。

2 實現文件下載的Action
Struts2的文件下載Action與普通的Action並無太大的不一樣,僅僅是該Action須要提供一個返回InputStream流的方法,該輸入流表明了被下載文件的入口。該Action類的代碼以下:
public class FileDownloadAction implements Action
{
//該屬性是依賴注入的屬性,該屬性能夠在配置文件中動態指定該屬性值
private String inputPath;
//依賴注入該屬性值的setter方法
public void setInputPath(String value)
{
inputPath = value;
}
/*
下載用的Action應該返回一個InputStream實例,
該方法對應在result裏的inputName屬性值爲targetFile
*/
public InputStream getTargetFile() throws Exception
{
return ServletActionContext.getServletContext().getResourceAsStream(inputPath);
}
//處理用戶請求的execute方法,該方法返回success字符串
public String execute() throws Exception
{
return SUCCESS;
}
}
從上面的Action中看到,該Action中包含了一個getTargetFile()方法,該方法返回一個InputStream輸入流,這 個輸入流返回的是下載目標文件的入口。該方法的方法名爲getTargetFile,代表該Action有一個targetFile屬性來返回下載文件。
一旦咱們定義了該Action,就可經過該Action來實現文件下載。編碼

3 配置Action
配置該文件下載的Action與配置普通的Action並無太大的不一樣,須要在配置普通Action的基礎之上,在加上額外的download的攔截器引用。
除此以外,關鍵是須要配置一個類型爲stream的結果,配置stream類型的結果時須要指定以下四個屬性:
? contentType:指定被下載文件的文件類型。
? inputName:指定被下載文件的入口輸入流。
? contentDisposition:指定下載的文件名。
? bufferSize:指定下載文件時的緩衝大小。
由於stream結果類型的邏輯視圖是返回給客戶端一個輸入流,所以無需指定location屬性。
提示:配置stream類型的結果時,由於無需指定實際的顯示的物理資源,因此無需指定location屬性,只須要指定inputName屬性,該屬性指向被下載文件。
下面是配置該下載所用的Action類的配置文件片斷:


"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">










\images\中.gif



image/gif

targetFile
filename="struts.gif"

4096




若是經過上面的Struts2提供文件下載支持來實現文件下載,就能夠實現包含中文文件名的文件下載。 xml

相關文章
相關標籤/搜索