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;}}
- Struts2下载文件中文乱码和IE空格处理
- struts2 文件下载文件名中文乱码及变成空格问题
- IE文件下载时中文文件名乱码
- Struts2 文件下载中文文件名乱码问题
- 解决Struts2文件下载文件名中文乱码
- struts2 文件下载中文乱码问题解决方案
- struts2文件下载中文乱码问题彻底解决
- Struts2文件下载中文乱码解决方案
- struts2解决下载中文文件乱码问题
- 处理下载文件时中文乱码
- 解决springmvc返回json数据IE出现文件下载和json数据中文乱码问题
- struts2中文乱码处理
- Struts2文件下载遇到中文乱码、中文丢失的解决方法
- struts2 下载文件,下载弹出框,文件名中文乱码
- IE 11下载文件中文乱码解决(go/php)
- Java: IE & Firefox下载文件中文乱码的兼容代码
- java下载文件中文文件名乱码问题(ie,谷歌,火狐)
- IE浏览器下载文件中文文件名乱码问题解决
- Java中Integer和int的区别
- 如何保存窗口状态
- 笔记:vim文本编辑器的几个常用命令
- .NET中的六个重要概念:栈、堆、值类型、引用类型、装箱和拆箱
- Linux内核部件分析——原子性操作atomic_t
- Struts2下载文件中文乱码和IE空格处理
- MapReduce:详解Shuffle过程
- Google Code Jam在线测试题目--Alien Language
- 解决python idle启动时Subprocess Startup Error
- 使用Visio进行UML建模
- 浏览器大全
- bean:define标签
- iReport 与 JasperReports 报表制作入门及部分问题解决方法
- HDU 1016-Prime Ring Problem(DFS)