struts2 下载中文名文件 bug 未命名错误 乱码错误 不能满足适应大众三大浏览器

来源:互联网 发布:mac快捷键截图 编辑:程序博客网 时间:2024/05/16 01:36
今天修改了一个一直悬而未决的问题,非常高兴!写下这个解决方案。 
Java代码  收藏代码
  1. 一 struts.xml文件的编辑  
  2.    <struts>  
  3.   <package name="crud-default" extends="convention-default">   
  4.     <action name="download" class="com.myweb.download.DownLoadAction">  
  5.      <!--type 为 stream 应用 StreamResult 处理-->  
  6.     <result name="success" type="stream">   
  7.      <!--默认为 text/plain-->  
  8.      <param name="contentType">application/x-msdownload;charset=ISO8859-1</param>  
  9.      <!-- 默认就是 inputStream,它将会指示 StreamResult 通过 inputName 属性值的 getter 方法,   
  10. 比如这里就是 getInputStream() 来获取下载文件的内容,意味着你的 Action 要有这个方法 -->  
  11.      <param name="inputName">inputStream</param>  
  12.      <!-- 默认为 inline(在线打开),设置为 attachment 将会告诉浏览器下载该文件,filename   
  13. 指定下载文件时的文件名,若未指定将会是以浏览的页面名作为文件名,如以 download.action 作为文件名 -->  
  14.      <param name="contentDisposition">attachment;filename="${fileName}"</param>  
  15.      <!-- 输出时缓冲区的大小 -->  
  16.      <param name="bufferSize">4096</param>  
  17.     </result>  
  18.     </action>   
  19.    </package>  
  20. </struts>  
  21. 二,com.myweb.download.DownLoadAction 的文件的代码  
  22.   public class DownLoadAction extends ActionBase {  
  23.     private Logger logger = LoggerFactory.getLogger(DownLoadAction.class);  
  24.     private String fileName = null;  
  25.     public String execute() throws Exception {  
  26.         return "success";  
  27.     }  
  28.     public InputStream getInputStream() {  
  29.       this.fileName = json.substring(json.lastIndexOf("\\") + 1, json.length());  
  30.       return Struts2Utils.getSession().getServletContext().getResourceAsStream(json);  
  31.     }  
  32.   
  33.     public String getFileName() {  
  34.         try {  
  35.              Struts2Utils.getResponse().setHeader("charset","ISO8859-1");  
  36.              return new String(this.fileName.getBytes(), "ISO8859-1");     
  37.         } catch (UnsupportedEncodingException e) {  
  38.             return "获取文件名出现了错误!";  
  39.         }  
  40.     }  
  41. }  

遇到的问题: 

文件可以下载,但是在websphere环境下,下载的文件的中文名是乱码,解决问题的步骤如下: 
第一,修改了struts.xml文件 



 




第二,修改了DownLoadAction.java文件的getFileName方法 
Java代码  收藏代码
  1. public String getFileName() {  
  2.       try {  
  3.          return new String(this.fileName.getBytes(), "ISO8859-1");     
  4.       } catch (UnsupportedEncodingException e) {  
  5.          return "获取文件名出现了错误!";  
  6.       }  
  7. }  


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

 

如上图所示,浏览器的默认编码从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 


**************************************************************博主修改***************************************************************

附:不能适应所有浏览器 chrome firefox 以上处理可以实现不乱码   但是IE浏览器不可以 用IE11测试不成功, 本文一下一篇有介绍使用所有浏览器的struts2 中文名称下载乱码问题


原创粉丝点击