Struts2 下載功能以及亂碼問題

下載功能

index.jsp

首先你要有一個按鈕。(我這裏是動態獲取文件,所以有一個num)

<button class="btn btn-default" type="button" onclick="downloadfile(num)">下載</button>";

JavaScript

使用window.open訪問action,並帶參數,爲需要下載的文件名。(我的文件路徑是在服務器端處理,你可以傳文件路徑)

function downloadfile(id){
	var filename=document.getElementById(id).innerHTML;
	window.open("fileDownload.action?filename=" + filename);
}

Struts2.xml

<action name="fileDownload" class="action.FileDownloadAction" >
	    <result name="success" type="stream">
		    <param name="contentType">application/octet-stream;charset=UTF-8</param>
		    <param name="inputName">inputStream</param>
		    <param name="contentDisposition">attachment;filename=${filename}</param>
		    <param name="bufferSize">1024</param>
	    </result>
    </action>

contentType 指定下載文件的文件類型 —— application/octet-stream 表示無限制
inputName 流對象名 —— 比如這裏寫inputStream,它就會自動去找Action中的getInputStream方法。
contentDisposition 使用經過轉碼的文件名作爲下載文件名 —— 默認格式是attachment;filename="${fileName}",將調用該Action中的getFileName方法。其中:attachment :下載時會打開下載框
bufferSize 下載文件的緩衝大小

引用

Action

我的action是FileDownloadAction,你需要做的就是在最後設置好一個InputStream,以供讀取。
我這裏是HDFS的輸入流,你可以依照情況更改。
然後filename需要做一些修改,不然下載時會亂碼。
toUTF8String(String str)是一個現成的轉換函數,直接copy走拿去用。這個函數我是這裏copy來的。

public class FileDownloadAction extends ActionSupport {
	private String filename;
	private InputStream inputStream;
	@Override
	public String execute() throws Exception {
		HadoopUtil hadooputil=new HadoopUtil();
		inputStream=hadooputil.getDownloadStream(hadooputil.getUserCurrentFolder(),filename);
		filename=toUTF8String(filename);
		return SUCCESS;
	}
	
	
	public static String toUTF8String(String str){
        StringBuffer sb = new StringBuffer();
        int len = str.length();
        for (int i = 0; i < len; i++)
        {
            // 取出字符中的每個字符
            char c = str.charAt(i);
            // Unicode碼值在0~255之間,不做處理
            if(c>=0 && c <= 255){
                sb.append(c);
            }else {
                // 轉換 UTF-8 編碼
                byte b[];
                try{
                    b = Character.toString(c).getBytes("UTF-8");
                }catch(Exception e){
                    e.printStackTrace();
                    b = null;
                }
                // 轉換爲%HH的字符串形式
                for(int j = 0;j < b.length ; j++){
                    int k = b[j];
                    if(k < 0){
                        k &= 255;
                    }
                    sb.append("%" + Integer.toHexString(k).toUpperCase());
                }
            }
        }
        return sb.toString();
    }
	
	
	public String getFilename() {
		return filename;
	}
	public void setFilename(String filename) {
		this.filename = filename;
	}
	public InputStream getInputStream() {
		return inputStream;
	}
	public void setInputStream(InputStream inputStream) {
		this.inputStream = inputStream;
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章