Struts2下载文件中文乱码和IE空格处理

来源:互联网 发布:宽带网络分线盒 编辑:程序博客网 时间:2024/05/21 15:26

Struts2下载文件中文乱码和IE空格处理


一、分析产生乱码的原因:

  首先我们来分析一下产生乱码的原因:由于客户端浏览器下载文件时,是通过地址重写向服务器端提交下载的文件名,而通常URL的编码方式是ISO-8859-1,而服务器端的编码是UTF-8、GB2312等,所以在后台代码进行转码。本文以UTF-8为例,其他编码也是一个道理。

  还有一个问题,对于不同的浏览器而言,采用的编码方式可能不同,比如说IE和Firefox,所以转码前还要判断一下浏览器的类型,采取不同的转码方式。


二、Struts2下载文件流程:

  以文件"复件OnePiece.png"的下载为例。
    
①执行setFileName():设置下载的文件名
     ---setFileName()---(转码前)文件名:?¤???? OnePiece.png
     fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");
     ---setFileName()---(转码后)文件名:复件 OnePiece.png


    ②执行execute():重写ActionSupport的方法

     ---文件名:复件OnePiece.png
     返回SUCCESS,转到 struts.xml: <param name="inputName">targetFile</param>

          

    ③执行getTargetFile():获取下载的文件流
     ---getTargetFile()---(转码前)文件名:复件OnePiece.png
     if IE:    *判断为 IE 浏览器(不用转码)*******getTargetFile()---文件名:复件 OnePiece.png

     if FF:   this.fileName = URLDecoder.decode(fileName, "ISO-8859-1");
        *判断为 FireFox 浏览器(转码后)*******getTargetFile()---文件名:复件 OnePiece.png


    ④执行getFileName():获取下载的文件名
     ------getFileName()---(转码前)文件名:复件OnePiece.png
     if IE:    this.fileName = URLEncoder.encode(fileName, "UTF-8");
     ---判断为IE---(转码后)文件名:%E5%A4%8D%E4%BB%B6+OnePiece.png
     ---替换空格:fileName = StringUtils.replace(fileName,"+", "%20");

     if FF:    this.fileName = new String(fileName.getBytes(),"ISO-8859-1");  
     ---判断为FireFox---(转码后)文件名:????OnePiece.png



   判断浏览器的方法:

     // 判断浏览器     HttpServletRequest request = ServletActionContext.getRequest();       //User Agent是Http协议中的一部分,向访问网站提供你所使用的浏览器类型等信息的标识     String agent = request.getHeader("User-Agent");       if(agent.contains("MSIE")){  //ie          ...     }else{  //firefox          ...     }


三、struts.xml配置

  有了上面的基础问题基本就解决了,不过我们还是要注意一下struts.xml的配置。

        <!-- 下载文件 -->        <action name="down" class="com.sky.struts.action.DnloadAction">        <result name="success" type="stream">          <!-- 下载文件类型定义 -->          <param name="contentType">application/octet-stream</param>          <!-- 下载文件输出流定义 -->          <param name="inputName">targetFile</param>  <!-- 下载文件的缓冲大小 -->  <param name="bufferSize">4096</param>          <!-- 下载文件处理方法 -->   <param name="contentDisposition">attachment;filename="${fileName}"</param>         </result>        </action>

OK!最后附上Action的详细代码微笑

package com.sky.struts.action;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;import javax.servlet.http.HttpServletRequest;import org.apache.commons.lang.xwork.StringUtils;import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionSupport;public class DnloadAction extends ActionSupport {private String fileName;@Overridepublic String execute() throws Exception {System.out.println("execute()---文件名:"+fileName);return SUCCESS;}public InputStream getTargetFile() throws Exception {    System.out.println("---getTargetFile()---(转码前)文件名:"+fileName);    // 判断浏览器    HttpServletRequest request = ServletActionContext.getRequest();            String Agent = request.getHeader("User-Agent");  <pre name="code" class="java">    if(Agent.contains("MSIE")){  //IE    System.out.println("*判断为 IE 浏览器(不用转码)*******getTargetFile()---文件名:"+fileName);     return ServletActionContext.getServletContext().getResourceAsStream("upload/"+fileName);            }else{  //FireFox        this.fileName = URLDecoder.decode(fileName, "ISO-8859-1");    System.out.println("*判断为 FireFox 浏览器(转码后)*******getTargetFile()---文件名:"+fileName);    return ServletActionContext.getServletContext().getResourceAsStream("upload/"+fileName);<pre name="code" class="java">    }}public String getFileName() throws UnsupportedEncodingException {    System.out.println("------getFileName()---(转码前)文件名:"+fileName);    // 判断浏览器    HttpServletRequest request = ServletActionContext.getRequest();              String Agent = request.getHeader("User-Agent");              if(Agent.contains("MSIE")){  //ie        this.fileName = URLEncoder.encode(fileName, "UTF-8");              //替换空格           fileName = StringUtils.replace(fileName,"+", "%20");          System.out.println("------getFileName()---判断为IE---(转码后)文件名:"+fileName);            }else{  //firefox        this.fileName = new String(fileName.getBytes(),"ISO-8859-1");          System.out.println("------getFileName()---判断为FireFox---(转码后)文件名:"+fileName);            }     return fileName;}public void setFileName(String fileName) throws UnsupportedEncodingException {    System.out.println("---setFileName()---(转码前)文件名:"+fileName);        fileName = new String(fileName.getBytes("ISO-8859-1"),"UTF-8");        System.out.println("---setFileName()---(转码后)文件名:"+fileName);    this.fileName = fileName;}}






1 0
原创粉丝点击