StrutsCatalog系列(6)--文件下載

/**
作者: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"選項。

發佈了84 篇原創文章 · 獲贊 2 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章