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

来源:互联网 发布:js给div设置id 编辑:程序博客网 时间:2024/05/16 04:35

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

原链接:内容出处链接

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

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