Struts2文件下载时,中文文件名和chorm不兼容问题

以下内容为转载,再加上自己的一些解决方法,如有冒犯,请见谅。新手上路,大家多多指教~~

原链接:内容出处链接

经过本人实验该方法非常简单:

Struts2文件下载时,如果所下载的文件名是中文时,就会出现乱码。
解决办法如下:

步奏一:修改fileName属性的set方法
public void setFileName(String fileName)
throws UnsupportedEncodingException {
this.fileName = new String(fileName.getBytes("ISO8859-1"), "utf-8");
}
步骤二:在getInputStream()方法中加上下面一句

我的补充:加上下面的代码,在MyEclipse自带的浏览器会正常显示,在chorm中会出现

收到了来自服务器的重复标头

ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION
问题,后面说到解决方法


ServletActionContext.getResponse().setHeader("Content-Disposition","attachment;fileName="+java.net.URLEncoder.encode(fileName, "UTF-8"));

http://www.cnblogs.com/gywbg --------------GYW

以下是我的补充:
jsp:
    <a href="hello?filename=1501560005_Java程序设计_教学进度表.doc" >dowmloading</a>
  </body>
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
	<package name="default" extends="struts-default">
		
		<action name="hello" class="com.szu.action.DownloadAction">
			<!-- 向action传递参数,指定路径 -->
			<param name="downloadFile">/image/</param>
			<result name="success" type="stream">
				<!-- 输入流名称,对应action类中的gettargetfile()方法 -->
				<param name="inputName" >targetFile</param>
				<!-- 设置下载名称,attachment :下载时会打开下载框 -->
				<param name="contentDisposition">
					filename=${filename};
				</param>
				<!-- 下载文件时缓冲区的大小 -->
				<param name="bufferSize">4096</param>
			</result>
		</action>
	</package>
</struts>    

DownloadAction.java:
package com.szu.action;

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.jasper.xmlparser.UTF8Reader;

import com.opensymphony.xwork2.ActionSupport;

public class DownloadAction extends ActionSupport{
	private String filename;
	private String downloadFile;
	public String getFilename() {//用这段代替原作者第二步骤的代码,即可解决chorm的兼容性
		System.out.println("gettname===="+filename);
		try {
			filename=java.net.URLEncoder.encode(filename, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println("gettname===="+filename);
		return filename;
	}
	public void setFilename(String filename) {
		System.out.println("setname===="+filename);
		try {
			filename=new String(filename.getBytes("ISO-8859-1"), "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println("setname===="+filename);
		this.filename = filename;
	}
	public String getDownloadFile() {
		
		return downloadFile;
	}
	//需要下载的文件路径
	public void setDownloadFile(String downloadFile) {  //路径由配置文件中传递过来
		this.downloadFile = downloadFile;
	}
	public InputStream getTargetFile()  {	//由上面的路径,生成它的输入流
		System.out.println("path="+downloadFile);
		File file=new File(downloadFile);
		downloadFile+=filename;
		InputStream in=ServletActionContext.getServletContext().getResourceAsStream(downloadFile);
		return in;
	}

	
	public String execute() throws Exception{
		return SUCCESS;
	}
}


控制台效果:(控制台出现乱码,在浏览器没出现乱码)
setname====1501560005_Java程序设计_教学进度表.doc
setname====1501560005_Java程序设计_教学进度表.doc
path=/image/
gettname====1501560005_Java程序设计_教学进度表.doc
gettname====1501560005_Java%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1_%E6%95%99%E5%AD%A6%E8%BF%9B%E5%BA%A6%E8%A1%A8.doc





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值