下载功能
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;
}
}