现在的位置: 首页 > 综合 > 正文

Struts2文件下载

2018年06月05日 ⁄ 综合 ⁄ 共 2066字 ⁄ 字号 评论关闭

Struts2通过org.apache.struts2.dispatcher.StreamResult结果类型来支持文件下载,重要属性:

contentType:用来指定下载文件的类型,application/octet-stream表示无限制。

inputName:流对象名,严格遵守JavaBean规范,它对应着Action中返回InputStream类型的方法名,假如inputName的值为downFile,则Action中必定有一个public InputStream getDownFile()方法。

contentDisposition:可以设定两个值,它的第一个值来设定文件打开方式,默认是inline即在浏览器中打开,也可以设定attachment(附件的形式),第二个值格式为filename="${fileName}",第二个值也严格遵守JavaBean规范,假设符号内的值为fileName,则Action中必定有一个public String getFileName()方法。

bufferSize:下载文件的缓冲区大小。

DownTestAction.java:

public class DownTestAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	
	/*要下载的文件名*/
	private String fileName = null;
	/*文件保存的路径(在struts.xml文件中注入)*/
	private String path;

	public String getPath() {
		return path;
	}

	public void setPath(String path){

		this.path = path;
	}

	public String getFileName() {

		try {
			 //在服务器端通过设置http Header, 设置了客户端的默认的字符集编码 
			ServletActionContext.getResponse().setHeader("charset", "ISO8859-1");
			return new String(this.fileName.getBytes(), "ISO8859-1");
		} catch (UnsupportedEncodingException e) {
			return "获取文件名出现错误!";
		}
	}

	public void setFileName(String fileName){
		
		this.fileName = fileName; 
	}

	/**
	 * 下载方法
	 * @return
	 * @throws FileNotFoundException
	 */
	public InputStream getInputStream() throws FileNotFoundException {
		/* 创建文件 */
		File file = new File(this.path + this.fileName);
		/* 创建文件输入流 */
		InputStream stream = new FileInputStream(file);

		return stream;
	}

}

struts.xml:

<action name="downTestAction" class="com.lixue.web.action.DownTestAction">
			<!-- 通过注入的方式指定文件的路径 -->
			<param name="path">D:/</param>
			<!--type 为 stream 应用 StreamResult 处理 -->
			<result name="success" type="stream">
				<!--默认为 text/plain -->
				<param name="contentType">application/x-msdownload;charset=ISO8859-1</param>
				<!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法, 比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->
				<param name="inputName">inputStream</param>
				<!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename 指定下载文件时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 download.action 作为文件名 -->
				<param name="contentDisposition">attachment;filename="${fileName}"</param>
				<!-- 输出时缓冲区的大小 -->
				<param name="bufferSize">4096</param>
			</result>
		</action>

下载页download.jsp:

 <body>
     <a href="downTestAction.action?fileName=web.txt">下载</a>
  </body>

抱歉!评论已关闭.