Struts2 文件下载及中文乱码问题的解决方案

 

来源:http://www.iteye.com/topic/699246

一、struts.xml文件

 

 

<struts>  
  <package name="crud-default" extends="convention-default">   
    <action name="download" class="com.myweb.download.DownLoadAction">  
     <!--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>   
   </package>  
</struts>  

 

 

二,com.myweb.download.DownLoadAction 的文件的代码 

 

 

  public class DownLoadAction extends ActionBase {  
    private Logger logger = LoggerFactory.getLogger(DownLoadAction.class);  
    private String fileName = null;  
    public String execute() throws Exception {  
        return "success";  
    }  
    public InputStream getInputStream() {  
      this.fileName = json.substring(json.lastIndexOf("\\") + 1, json.length());  
      return Struts2Utils.getSession().getServletContext().getResourceAsStream(json);  
    }  
  
    public String getFileName() {  
        try {  
             Struts2Utils.getResponse().setHeader("charset","ISO8859-1");  
             return new String(this.fileName.getBytes(), "ISO8859-1");     
        } catch (UnsupportedEncodingException e) {  
            return "获取文件名出现了错误!";  
        }  
    }  
}  

 

 

遇到的问题:

文件可以下载,但是在websphere环境下,下载的文件的中文名是乱码,解决问题的步骤如下:

 

第一,修改了struts.xml文件


Struts2 文件下载及中文乱码问题的解决方案_第1张图片
第二,修改了DownLoadAction.java文件的getFileName方法

 

 

    public String getFileName() {  
          try {  
             return new String(this.fileName.getBytes(), "ISO8859-1");     
          } catch (UnsupportedEncodingException e) {  
             return "获取文件名出现了错误!";  
          }  
    }  

 

 

在新弹出IE窗口中,第一次下载时,下载提示框中文仍然是乱码, 再次下载,就可以正常显示中文。整个应用软件包 的默认编码是UTF-8, 在第一次下载之后,客户端浏览器的默认编码被修改为ISO8859-1,再次下载中文就可以正常 显示,因为这时候IE浏览器的字符集编码是西欧ISO

 


Struts2 文件下载及中文乱码问题的解决方案_第2张图片

 

如上图所示,浏览器的默认编码从UTF-8修改为西欧ISO
那我们又该如何解决这个第一次下载时出现乱码的问题呢?

第三,继续修改DownLoadAction.java文件的getFileName方法

 

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

 

附: 如果整体修改为UTF-8下载反而会出现"未知的文件名"的错误提示,http请求中默认的编码有可能是ISO8859-1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(struts2)