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;
	}
	
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章