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