/**
作者:Joe Vienneau
譯者:Rifoo Technology(http://www.rifoo.com)
時間:2005-11-10
備註:轉載請保留以上聲明
**/
Struts 1.2.6中推出了新的DownloadAction,用來簡化下載操作。
實現DownloadAction
我們需要擴展org.apache.struts.actions.DownloadAction並實現
getStreamInfo()方法。如果我們要更改默認的緩衝大小,我們也可以覆蓋
getBufferSize()方法。
實現getStreamInfo() 方法
getStreamInfo() 方法返回一個StreamInfo對象- 它是DownloadAction類的內
部類,其實是個內部接口。DownloadAction爲這個接口提供了兩個具體的靜態內
部實現類:
FileStreamInfo - 簡化從磁盤系統下載文件。需要連同content type傳入一個java.io.File對象到構造方法中。
ResourceStreamInfo - 簡化從web應用資源下載文件。需要傳入ServletContext,路徑以及content type 到它的構造方法中。
在下面的例子中,我們還提供了一個以Byte array方法實現StreamInfo接口的代
碼。
實現getBufferSize() 方法
DownloadAction默認返回4096byte的緩衝區我們可以覆蓋這個方法來自定義用
來傳輸文件的緩衝區大小
範例
下面有三個例子:
使用文件
使用web應用資源
使用byte array
FileStreamInfo範例
DownloadAction使用文件的例子。這個範例從struts-config.xml的action
mapping的parameter屬性來得到文件名。
import java.io.File;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DownloadAction;
public class ExampleFileDownload extends DownloadAction{
protected StreamInfo getStreamInfo(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
// Download a "pdf" file - gets the file name from the
// Action Mapping's parameter
String contentType = "application/pdf";
File file = new File(mapping.getParameter());
return new FileStreamInfo(contentType, file);
}
}
ResourceStreamInfo範例
DownloadAction使用web應用資源的範例。這個範例從struts-config.xml的
action mapping的parameter屬性來得到web應用資源的路徑。
Byte Array 範例
DownloadAction使用字節數組(byte array)的範例。
這個例子創建了一個實現了StreamInfo接口的ByteArrayStreamInfo內部類。
在WEB頁面上使用DownloadAction
最大的疑惑是我麼如何使用這個Action?
需要做兩件事情:
和任何Struts的action一樣,需要在struts-config.xml中進行配置。
在WEB頁面中使用它對文件進行連接
下面是struts-config.xml配置的一個例子:
那麼在我們的JSP頁面,可以使用類似下面的例子:
注意:我們可能要將struts配置文件中<controller>屬性的nocache值設置爲false。如果設置爲true,可能在IE上不能成功下載文件,但是在Firefox和Safari上工作正常。
內容部署(Content Disposition)
設置Content Disposition
DownloadAction不能處理content dispositon頭部。最簡單的方法是在getStreamInfo()方法中設置,比如:
如果需要文件名做爲參數,可能需要首先把文件前面的任何路徑信息先清除。
Content Disposition的值
我們可以設置content disposition來下載一個文件或者在瀏覽器中打開一個文件。
在瀏覽器中打開文件的例子寫法: "inline; filename=myFile.pdf"
下載的例子寫法: "attachment; filename=myFile.pdf"
顯示圖片的話,可以使用content disposition的"inline"選項。