首页 > 代码库 > 文件下载--Struts2的中文文件下载显示为空格问题

文件下载--Struts2的中文文件下载显示为空格问题

文件下载--Struts2的中文文件下载显示为空格问题

 

前言:最近公司项目中用到文件下载,根据底层,决定使用struts2的文件下载模式。乱码大多数都解决了,居然出现中文文件下载时,中文文字显示为空格的奇葩现象。在经过近三个小时的查询各种文档和苦思冥想,最终发现了问题。见网上还没有战友发出这个现象的文章,所以就写出来,分享给大家。

 

Struts2的配置文件中:

 

                   <!--数据文件下载 -->

                   <actionname="downloadTemplFile" class="fileDownloadAction">

         <result name="success" type="stream">

               <paramname="contentType">text/plain</param>

               <paramname="contentType">application/octet-stream;charset=ISO8859-1</param> 

               <paramname="contentDisposition">attachment;fileName="${downloadFileName}"</param> 

               <paramname="inputName">inputStream</param>

               <paramname="bufferSize">1024</param>

         </result>

       </action>

 

Java的使用方式:

 

         publicString getDownloadFileName() {

                      String fileName1 =ServletActionContext.getRequest().getParameter("fileName");

                      try {

                            fileName1= new String(fileName1.getBytes("ISO8859-1"), "utf-8");

                   }catch (UnsupportedEncodingException e1) {

                            e1.printStackTrace();

                   }

                      String downFileName = fileName1;

                      try {

                       downFileName = newString(downFileName.getBytes(), "ISO8859-1");

                      } catch (Exception e) {

                       e.printStackTrace();

                      }

                     System.out.println("downFileName====================>"+downFileName);

                      return downFileName;

}

        

         publicInputStream getInputStream() throws Exception{

                   String  fileName1 =ServletActionContext.getRequest().getParameter("fileName");

                   Stringname = new String(fileName1.getBytes("ISO8859-1"),"utf-8");

                   System.out.println("name===========>"+name);

                   InputStreamin =ServletActionContext.getServletContext().getResourceAsStream("/custMonitorFile/"+name);

                   System.out.println(in);

                   returnin;

                  

         }

        

         @Override 

         publicString execute() throws Exception { 

      

    return SUCCESS; 

         }

 

说明:

为什么Java源码中转两次?

回答:

//第一次 从jsp的get或者post获取的字段需要转码。

String fileName1 =ServletActionContext.getRequest().getParameter("fileName");

fileName1 = newString(fileName1.getBytes("ISO8859-1"), "utf-8");

 

//第二次 设置中文文件名要以“ISO8859-1”的格式发给客户端。

String downFileName = fileName1;

downFileName = newString(downFileName.getBytes(), "ISO8859-1");

 

 

注意:一定要弄清楚每次转码的目的,始发与终点。


如有好的建议,可留言或发至笔者邮箱:fzb_xxzy@163.com

文件下载--Struts2的中文文件下载显示为空格问题