struts2 文件下载处理

这里说的文件下载指的是通过Java代码返回文件流给客户端,而不是直接链接一个具体的文件URL。
原理:Action中定义一个读取文件流的方法,返回值为InputStream,声明Action时,result类型为stream,参数指定读取文件流的方法以及返回给客户端的文件名。
下面的例子是让用户自己提交文件路径,Action再读取该文件并返回给客户端,当然,在真实的项目中,这样做是很不安全的。

DownloadAction2.java:


package com.struts2;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction2 extends ActionSupport {
	
	private String fileName;
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public InputStream getDownloadFile()
	{
		//以下几行先把get得到的文件名转换编码,否则中文文件名取不到文件
		String utfFileName=null;
		try {
			utfFileName=new String(fileName.getBytes("iso8859_1"),"UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return ServletActionContext.getServletContext().getResourceAsStream(utfFileName);
	}
	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return super.execute();
	}
}

struts.xml配置:


		
		<!-- result的type设为stream,参数inputName值与Action中的返回InputStream的方法getDownloadFile对应
			contentDisposition参数attachment代表无论何种文件,均弹出下载框,而不是用浏览器打开,
			filename指定下载时默认的文件名,通过${属性名}取action中的属性
		 -->
		<action name="downloadFile2" class="com.struts2.DownloadAction2">
			<result type="stream">
				<param name="inputName">downloadFile</param>
				<param name="contentDisposition">attachment;filename=${fileName}</param>
			</result>
		</action>

测试:
http://localhost:8080/struts2/downloadFile2.do?fileName=index.jsp

© 2012, 冰冻鱼. 请尊重作者劳动成果,复制转载保留本站链接! 应用开发笔记