JSP文件下载时文件名在ie和firefox下面文件名不一致极其超链接中文乱码的问题的改进
response.setContentType("application/octet-stream;charset=UTF-8");
fileName=java.net.URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
此时在ie下面点击文件下载的时候能够正确显示中文名称但是此时在firefox下面却显示1_%E4%B8%AD%E6%96%87%E6%96%87%E4%BB%B6123.doc然后我又试了另一种方案
response.setContentType("application/octet-stream;charset=UTF-8");
fileName = new String(fileName.getBytes("UTF-8"),"iso-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
此时在ie下面下载的时候弹chu的文件名是乱码;而在firefox下面却正确显示1_中文文件XXX.doc。
我想要的是不管是ie还是firefox都正确显示1_中文XX.doc,不知道大家有没有遇到过类似的问题,解决之道是什么?
也许判断浏览器类型来进行不同的处理会是一种解决方案,但是这是一种个人觉得迫不得已的解决方案。
=================工具类=============================
package com.jub.jubweb1.JTool;
import javax.servlet.http.HttpServletRequest;
public class JToolWeb {
//文件下载时文件名在ie和firefox下面表现不一致问题,乱码
public static String processFileName(HttpServletRequest request,String fileNames){
String codedfilename = null;
try{
String agent =request.getHeader("USER-AGENT");
if(null != agent && -1 != agent.indexOf("MSIE")){//ie
String prefix = fileNames.lastIndexOf(".")!=-1?fileNames.substring(0,fileNames.lastIndexOf(".")):fileNames;
String extension = fileNames.lastIndexOf(".")!=-1?fileNames.substring(fileNames.lastIndexOf(".")):"";
String name = java.net.URLEncoder.encode(fileNames, "UTF8");
if(name.lastIndexOf("%0A")!=-1){
name = name.substring(0,name.length()-3);
}
int limit = 150 - extension.length();//文件名超过 17 个中文字符,在 IE 下会有问题
if (name.length() > limit) {
name = java.net.URLEncoder.encode(prefix.substring(0, Math.min(prefix.length(), limit / 9)), "UTF-8");
if(name.lastIndexOf("%0A")!=-1){
name = name.substring(0,name.length()-3);
}
}else{
return name;
}
codedfilename = name + extension;
} else if (null != agent && -1 != agent.indexOf("Mozilla")) {//火狐
codedfilename = "=?UTF-8?B?"+(new String(org.apache.commons.codec.binary.Base64.encodeBase64(fileNames.getBytes("UTF-8"))))+"?=";
}else {
codedfilename = fileNames;
}
}catch(Exception e){
e.printStackTrace();
}
return codedfilename;
}
}
=================================jsp============================================
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8;" import="java.io.*,com.jub.jubweb1.JTool.*" pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>下载</title>
</head>
<body>
<%
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html");
//关于文件下载时采用文件流输出的方式处理:
//加上response.reset(),并且所有的%>后面不要换行,包括最后一个;
///response.reset();//可以加也可以不加 ,注意加了之后tomcate需要配置UTF-8否则乱码
String filePath=request.getSession().getServletContext().getRealPath("")+request.getParameter("path");
File file = new File(filePath);
if (!file.exists() || file.isDirectory()) {
filePath=new String(filePath.getBytes("iso-8859-1"),"UTF-8");//防止tomcate编码不一
file = new File(filePath);
if (!file.exists() || file.isDirectory()){//二次验证
%>
<script type="text/javascript" charset="UTF-8">
alert('抱歉,资源正在维护中,请稍后再试,如果有需要请联系我们的客服,谢谢!');
</script>
<%
System.out.print(filePath);
return;
}
}
String fileName=filePath.substring(filePath.lastIndexOf("\\")+1,filePath.length());
System.out.print(fileName);
System.out.print(filePath);
//filename=new String(filename.getBytes("iso8859-1"),"gb2312");//使用超链接解决中文乱码
// 设置响应头和下载保存的文件名
response.setContentType("application/x-download");
//response.addHeader("Content-Disposition","attachment;filename=" +new String(fileName.getBytes("gb2312"),"iso8859-1"));//解决中文乱码
//response.addHeader("Content-Disposition","attachment;filename=" + java.net.URLEncoder.encode(fileName,"utf-8"));//解决中文乱码
String t=JToolWeb.processFileName(request,fileName);
response.addHeader("Content-Disposition","attachment;filename="+t);//解决中文乱码
System.out.println(t+"--------");
response.setContentLength((int)file.length());
java.io.OutputStream outp = null;
java.io.FileInputStream in = null;
try
{
outp = response.getOutputStream();
in = new FileInputStream(file);
byte[] b = new byte[1024];
int i = 0;
while((i = in.read(b)) > 0)
{
outp.write(b, 0, i);
}
//
outp.flush();
//要加以下两句话,否则会报错
//java.lang.IllegalStateException: getOutputStream() has already been called for //this response
out.clear();
out = pageContext.pushBody();
}
catch(Exception e)
{
System.out.println("Error!");
e.printStackTrace();
}
finally
{
if(in != null)
{
in.close();
in = null;
}
//这里不能关闭
//if(outp != null)
//{
//outp.close();
//outp = null;
//}
}
%>
</body>
</html>
===========================jsp==================================
<a href='javascript:subFrom("/jubweb1/down/down_stream.jsp","\\download\\erp\\行政管理手册.doc")'>下载</a>
<!--下载使用的表单-->
<form id="down_frm" name="down_frm" method="post" target="down_if" style="display:none;">
<input type="hidden" id="path" name="path"/>
</form>
<iframe id="down_if" name="down_if" style="display:none;"></iframe><!--下载使用的iframe-->
<script>
function subFrom(url,param){
$("#path").attr("value",param);
$("#down_frm").attr("action",url);
$("#down_frm").attr("method","post");
$("#down_frm").submit();
}
</script>
JSP文件下载时文件名在ie和firefox下面文件名不一致极其超链接中文乱码的问题的改进的更多相关文章
- css中em小于1时chrome字体大小和firefox字体大小不一致的问题
css中em设置为0.8,结果页面显示,chrome字体比firefox字体大了不少. chrome有默认字体大小,默认为12px.设置的字体大小小于12px时,也是按照12px来显示. firefo ...
- JSP中文乱码问题解决方法小结
在使用JSP的过程中,最使人头疼的一个问题就是中文乱码问题,以下是我在软件开发中遇到的乱 码问题以及解决方法. 1.JSP页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要 ...
- jsp中文乱码解决办法
一.JSP页面显示乱码 二.表单提交中文时出现乱码 三.数据库连接 大家在JSP的开发过程中,经常出现中文乱码的问题,可能一至困扰着您,我现在把我在JSP开发中遇到 的中文乱码的问题及解决办法写出来供 ...
- jsp中文乱码六种情况---解决方案
转 jsp中文乱码六种情况---解决方案 2016年10月22日 21:32:55 阅读数:10672 来源:http://blog.csdn.net/lovesummerforever/articl ...
- JSP文件下载及出现getOutputStream() has already been called for this response的解决方法
JSP文件下载及出现getOutputStream() has already been called for this response的解决方法 http://iamin.blogdriver.c ...
- 【.net】在ASP.NET中,IE与Firefox下载文件名中带中文汉字的文件,文件名乱码的问题
#问题:客户端为ie或Firefox,服务端为asp.net时,下载文件名中包含中文汉字时,下载下来的文件的文件名是乱码: #解决方案: 示例代码:下载名称中带汉字的文件: public void P ...
- 解决 Firefox 下载文件名乱码扩展 ReDisposition
作者 muzuiget 发布 2013-03-13 19:23 标签 redisposition Firefox 下载文件名乱码问题由来已久,偶然一两次还可以手动改名,批量下载时简直要亲命,最终我 ...
- C#导出Excel文件Firefox中文件名乱码
首先说明下:我的解决方法不一定适用于其他遇到该问题的人,因为情况多种多样,适合我的方法不一定适合别人,就像我在遇到问题时查到别人的解决方案放到我的代码里却不管用,所以这个方法仅供参考 这两天做了一个导 ...
- jsp 文件下载
有的时候一个模板的下载,这种简单的下载服务端已存在文件功能,就可以方便的通过jsp文件下载的方式来轻松实现. //jsp 页面 js /** * 导出角色 */ function exportRole ...
随机推荐
- 设置sudo不输入密码 sudoers 编辑出错后的补救方法
一 设置sudo为不需要密码 有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替.默认新建的用户不在sudo组,需要编辑/etc/sudoers文件 ...
- js数组的声明与应用
js数组的声明与应用 数组:一种容器,存储批量数据.JavaScript是一种弱类型语言.什么是弱类型,就是变量可以存储多种类型变量的引用不会报错.所以js数组可以存储不同的数据. 一.数组的作用:只 ...
- VIM Ctrl-V Conflict with Windows Paste
/************************************************************************************** * VIM Ctrl-V ...
- hibernate封装查询,筛选条件然后查询
// 封装查询条件 @Test public void transmitParameter() { Map map = new HashMap<String, String>(); // ...
- [转载] ubuntu Authentication failure
ubuntu的root用户默认是禁止的,需要手动打开才行.事实上ubuntu下的所有操作都用不到root用户,由于sudo的合理使用,避免了root用户下误操作而产生的毁灭性问题.root账号启用方法 ...
- centos6 下安装xfce+vnc
CentOS 安装图形界面的过程,简单记录一下.这里提供了两种图形界面的安装,分别是CentOS自带的gnome桌面及轻巧的xfce.据测试,我的精简版CentOS 6 64位系统安装gnome需要下 ...
- UVa 11464 Even Parity 偶数矩阵
给你一个 n * n 的 01 矩阵,现在你的任务是将这个矩阵中尽量少的 0 转化为 1 ,使得每个数的上下左右四个相邻的数加起来是偶数.求最少的转化个数. 首先,n 的规模并不大,最大只有15.但是 ...
- xcode的ios工程目录结构
目录结构: a.supporting files: main.m和资源文件 xxx-info.plist:包含应用程序相关属性列表,如版本,程序名等 .pch文件:预编译头文件,相当于MFC里的std ...
- C#利用最新版的WPS实现导入导出
微软的EXCEl操作相信大家也知道,不方便,安装包太大,而且表格的数据量也只有6000多(是6000多还是60000多我就忘记了),在导出导入大量数据的就没办法,而wsp表格则实现了百万数据的容量,而 ...
- pthread_attr_t 线程属性(二)
一.函数: 1.线程属性的初始化与销毁:#include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthrea ...