Struts2中文文件的下载

访问页面:

<body>
	<a href="${pageContext.request.contextPath }/DownloadAction2?filename=ss.txt">下载ss.txt</a>
	<a href="${pageContext.request.contextPath }/DownloadAction2?filename=密码.flv">下载密码</a>
</body>

下载文件的Action:

package com.itcast.action;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import sun.misc.BASE64Encoder;
public class DownloadAction2 extends ActionSupport{
	private String filename;	//准备下载的文件的名称
	private String contentType;		//准备下载文件的类型,MimeType.
	
	//处理文件的名称
	public String getFilename() throws UnsupportedEncodingException {
		//对不同浏览器传递过来的文件名进行编码,这里应该是服务器在将文件发送给浏览器的时候,根据不同的浏览器而对文件名编码,以便下载的文件名(中文)能够正常显示.
			return encodeDownloadFilename(filename, 
				ServletActionContext.getRequest().getHeader("User-Agent"));
		
	}
	
	public void setFilename(String filename) throws UnsupportedEncodingException {
		//对文件名称编码,这里是浏览器发送请求到服务器时,服务器对携带的文件名进行解码和编码.
		filename = new String(filename.getBytes("iso8859-1"), "utf-8");
		this.filename = filename;
	}

	//处理文件的类型
	public String getContentType() {
		return ServletActionContext.getServletContext().getMimeType(filename);
	}
	
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	//下载文件的入口
	public InputStream getDownFile() {
		//要下载的文件的路劲
		String filepath = "/save/" + filename;
		return ServletActionContext.getServletContext().getResourceAsStream(filepath);
	}

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}
	
	/**对不同浏览器传递过来的文件名称进行转码
	 * name:文件名称
	 * agent:浏览器
	 * return 返回转码后的名称
	 */
	public String encodeDownloadFilename(String name,String agent) throws UnsupportedEncodingException {
		if (agent.contains("Firefox")) {  //火狐浏览器
			name="=?UTF-8?B?" + new BASE64Encoder().encode(name.getBytes("utf-8")) + "?=";
		} else {	//IE及其它浏览器
			name = URLEncoder.encode(name, "utf-8");
		}
		return name;
		
	}
}

配置文件:

<!--解决了下载中文名字文件乱码问题的action  -->
		<action name="DownloadAction2" class="com.itcast.action.DownloadAction2">
			<result type="stream">
				<!--文件的类型 使用OGNL表达式获取\值栈 -->
				<param name="contentType">${contentType}</param>
				<!--文件的下载方式和名字 使用OGNL表达式获取 -->
				<param name="contentDisposition">
					attachment;filename=${filename}
				</param>
				<!--下载文件的入口 -->
				<param name="inputName">DownFile</param>
				<!-- 下载缓存大小 -->
				<param name="bufferSize">1024</param>
			</result>
		</action>

配置文件中${filename} 和${contentType}相当于action.getFilename()和action.getContentType()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值