文件下载,文件名乱码

时间:2022-02-12 19:15:29
功能:文件下载:

代码部分如下:

String strFileName = "测试.txt";
m_response.setHeader("Content-Disposition", "attachment; filename="+strFileName);
当访问这个servlet时:提示是否保存文件,
1、点击保存,文件名乱码;
2、点击打开,文件正常打开,不过文件的标题也是乱码;

如果这样:
String strFileName = toUtf8String("测试.txt");
m_response.setHeader("Content-Disposition", "attachment; filename="+strFileName);
public static String toUtf8String(String s) {
StringBuffer sb = new StringBuffer();
for (int i=0;i<s.length();i++) {
char c = s.charAt(i);
if (c >= 0 && c <= 255) {
sb.append(c);
} else {
byte[] b;
try {
b = c.toString().getBytes("utf-8");
} catch (Exception ex) {
System.out.println(ex);
b = new byte[0];
}
for (int j = 0; j < b.length; j++) {
int k = b[j];
if (k < 0) k += 256;
sb.append("%" + Integer.toHexString(k).
toUpperCase());
}
}
}
return sb.toString();
}

当访问这个servlet时:提示是否保存文件,
1、点击保存,文件名正常;
2、点击打开,文件正常打开,不过文件的标题是类似"%B%%%"的样子

请高手解答,怎么样才能使保存和打开文件名都不乱

18 个解决方案

#1


分太少了。。。100分就给你一个现成的。。。。邮箱给我。。。

#2


关注一下,我也有这个问题

#3


zhonghua_8888@163.com
如果问题能解决分不是问题.先谢谢了!

#4


发完了。。

#5


我的QQ:69632928

我们可以相户学习。。。

#6


我以前被这个问题搞了好久,现在分享一下哈。
1,如果是自己写servlet下载的话,
response.setContentType("application/octet-stream");
byte[] b=fileName.getBytes("GBK");
fileName=new String(b,"8859_1");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
2,用oreilly的cos.jar组件。
String contentType = request.getSession().getServletContext().getMimeType(fileName);
        ServletOutputStream sos=null;
        
        if (contentType != null) {
            response.setContentType(contentType);
        } else {
            response.setContentType("application/octet-stream");
        }
        
        try {
            sos=response.getOutputStream();
            response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("gb2312"), "iso8859-1") + "\"");
            ServletUtils.returnFile(downPath, sos);
            }catch(Exception e){
...
}finally{
 ......
}

补充一点:用了好多开源上传下载组件,发现基本上每个都不尽如人意,普遍的一个问题是在多用户并发上传文件时,过一段时间(可能是几小时,可能是几天)之后,容器就会死掉,表现为系统不能再登陆,但是死掉的时候服务器占用资源(包括内存和cpu)又不是很大,估计是系统已经不能再分配资源了。而把这些上传下载功能屏蔽掉系统就无事。看来

#7


行是不行呀。楼主给话呀?!

#8


ms6309a(ak47ms6309a) 你好,你给我的东东和我的一样,没有解决打开文件时的乱码问题!

#9


to:singinthesky(ichoose)。。。。你就不能给人家一个全的吗?
好人做到底吗!!!

#10


晕,为了不浪费csdn的资源啊,而且其他代码都很简单的,不会也要帖出来吧

#11


不会吧。。。我的都是正常的。。。。

#12


请问singinthesky(ichoose) 我用的方法:
1,如果是自己写servlet下载的话,
response.setContentType("application/octet-stream");
byte[] b=fileName.getBytes("GBK");
fileName=new String(b,"8859_1");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
乱码解决了,可是当文件名中有"."的时候,打开下载时文件名里在.之前总是有一个[1]这个问题怎么解决啊?

#13


呵呵,那你就用substring之类的来修正它啦,可以专门写一个公共方法。我这里没出现这情况哦。

#14


OK!谢谢两位了

#15


to:singinthesky(ichoose)。。。行了老兄。。。什么好用的东西到他那儿也不好使了。。也不知道他是怎么整的!!

#16


singinthesky(ichoose),你说的用substring之类的来修正我实现不了.因为那个[1]是在response.setHeader("Content-Disposition","attachment;filename="+fileName);之后在页面上的时候出现的.麻烦你试一下你的程序看看吧?能不能解决?

#17


ms6309a(ak47ms6309a) 我佩服你的RP

#18


这个[1]是操作系统自己加上去的,如果文件名带有2个或者2个以上的“.”的话,就会自动在第一个“.”前加上“[1]”。目前还没想到解决办法,因为以前也没考虑过会出现这种情况。或者变通一下,将其他“.”用下划线“_”替代?

#1


分太少了。。。100分就给你一个现成的。。。。邮箱给我。。。

#2


关注一下,我也有这个问题

#3


zhonghua_8888@163.com
如果问题能解决分不是问题.先谢谢了!

#4


发完了。。

#5


我的QQ:69632928

我们可以相户学习。。。

#6


我以前被这个问题搞了好久,现在分享一下哈。
1,如果是自己写servlet下载的话,
response.setContentType("application/octet-stream");
byte[] b=fileName.getBytes("GBK");
fileName=new String(b,"8859_1");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
2,用oreilly的cos.jar组件。
String contentType = request.getSession().getServletContext().getMimeType(fileName);
        ServletOutputStream sos=null;
        
        if (contentType != null) {
            response.setContentType(contentType);
        } else {
            response.setContentType("application/octet-stream");
        }
        
        try {
            sos=response.getOutputStream();
            response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(fileName.getBytes("gb2312"), "iso8859-1") + "\"");
            ServletUtils.returnFile(downPath, sos);
            }catch(Exception e){
...
}finally{
 ......
}

补充一点:用了好多开源上传下载组件,发现基本上每个都不尽如人意,普遍的一个问题是在多用户并发上传文件时,过一段时间(可能是几小时,可能是几天)之后,容器就会死掉,表现为系统不能再登陆,但是死掉的时候服务器占用资源(包括内存和cpu)又不是很大,估计是系统已经不能再分配资源了。而把这些上传下载功能屏蔽掉系统就无事。看来

#7


行是不行呀。楼主给话呀?!

#8


ms6309a(ak47ms6309a) 你好,你给我的东东和我的一样,没有解决打开文件时的乱码问题!

#9


to:singinthesky(ichoose)。。。。你就不能给人家一个全的吗?
好人做到底吗!!!

#10


晕,为了不浪费csdn的资源啊,而且其他代码都很简单的,不会也要帖出来吧

#11


不会吧。。。我的都是正常的。。。。

#12


请问singinthesky(ichoose) 我用的方法:
1,如果是自己写servlet下载的话,
response.setContentType("application/octet-stream");
byte[] b=fileName.getBytes("GBK");
fileName=new String(b,"8859_1");
response.setHeader("Content-Disposition","attachment;filename="+fileName);
乱码解决了,可是当文件名中有"."的时候,打开下载时文件名里在.之前总是有一个[1]这个问题怎么解决啊?

#13


呵呵,那你就用substring之类的来修正它啦,可以专门写一个公共方法。我这里没出现这情况哦。

#14


OK!谢谢两位了

#15


to:singinthesky(ichoose)。。。行了老兄。。。什么好用的东西到他那儿也不好使了。。也不知道他是怎么整的!!

#16


singinthesky(ichoose),你说的用substring之类的来修正我实现不了.因为那个[1]是在response.setHeader("Content-Disposition","attachment;filename="+fileName);之后在页面上的时候出现的.麻烦你试一下你的程序看看吧?能不能解决?

#17


ms6309a(ak47ms6309a) 我佩服你的RP

#18


这个[1]是操作系统自己加上去的,如果文件名带有2个或者2个以上的“.”的话,就会自动在第一个“.”前加上“[1]”。目前还没想到解决办法,因为以前也没考虑过会出现这种情况。或者变通一下,将其他“.”用下划线“_”替代?