本文将简单介绍使用 struts2 ,通过零配置和 annotation 实现文件下载功能。
文件夹目录
web.xml有关struts的配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
Action代码
package com.nos.java.action.downl;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.ResultPath;
import org.apache.struts2.convention.annotation.Results;
import com.nos.base.action.BaseAction;
/**
* 文件下载
*
*/
@Results({
@Result(params = {
// 下载的文件格式
"contentType", "application/octet-stream",
// 调用action对应的方法
"inputName", "inputStream",
// HTTP协议,使浏览器弹出下载窗口
"contentDisposition", "attachment;filename=\"${fileName}\"",
// 文件大小
"bufferSize", "10240"},
// result 名
name = "download",
// result 类型
type = "stream")
})
public class DownloadAction extends BaseAction{
private static final long serialVersionUID = 1L;
/**
* 下载文件名
* 对应annotation注解里面的${fileName},struts 会自动获取该fileName
*/
private String fileName;
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
/**
* 下载文件应访问该地址
* 对应annotation注解里面的 name = "download"
*/
public String testDownload() {
return "download";
}
/**
* 获取下载流
* 对应 annotation 注解里面的 "inputName", "inputStream"
* 假如 annotation 注解改为 "inputName", "myStream",则下面的方法则应改为:getMyStream
* @return InputStream
*/
public InputStream getInputStream() {
// 文件所放的文件夹
String path = ServletActionContext.getServletContext().getRealPath("/")+"\\app\\";
// 下载路径
String downLoadPath = path + fileName;
// 输出
try {
return new FileInputStream(downLoadPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
URL访问地址
<a href="${ipUrl}/downl/download!testDownload.action?fileName=VR.apk">点击下载</a>