java.net.URLEncoder.java的源代码为:
[code]
if (dontNeedEncoding.get(c)) {
if (c == ' ') {
c = '+';
needToChange = true;
}
//System.out.println("Storing: " + c);
out.append((char)c);
i++;
}
[/code]
测试代码
[code]
String url="http://618119.com/docs/测试 空格.doc";
String nurl=url.substring(0,url.lastIndexOf('/')+1)+java.net.URLEncoder.encode(url.substring(url.lastIndexOf('/')+1), "UTF-8");
System.out.println(nurl);
System.out.println(java.net.URLDecoder.decode(nurl, "UTF-8"));
[/code]
执行的结果为:
http://618119.com/docs/%E6%B5%8B%E8%AF%95+%E7%A9%BA%E6%A0%BC.doc
http://618119.com/docs/测试 空格.doc
而在与同事调试的时候,发现对方的web服务器处理得有点问题,没能将加号还原为空格,
对文件名只截取到了空格前面部分的内容,导致在下载的时候,
头信息 content-disposition和Content-Type
写入的内容不对,导致手机无法正常下载文件。
无法正常下载到手机时的头信息是:
content-disposition: attachment; filename=”测试”
Content-Type: application/octet-stream因此修改代码,对url进行替换,将加号替换成”%20″;
修改后的代码为:
[code]
String url="http://618119.com/docs/测试 空格.doc";
String nurl=url.substring(0,url.lastIndexOf('/')+1)+java.net.URLEncoder.encode(url.substring(url.lastIndexOf('/')+1), "UTF-8");
nurl=nurl.replaceAll("\\+", "%20");//处理空格
System.out.println(nurl);
System.out.println(java.net.URLDecoder.decode(nurl, "UTF-8"));
[/code]
执行结果为:
http://618119.com/docs/%E6%B5%8B%E8%AF%95%20%E7%A9%BA%E6%A0%BC.doc
http://618119.com/docs/测试 空格.doc
用手机可以正常下载文件时的头信息为:
content-disposition: attachment; filename=”测试 空格.mp3″
Content-Type: audio/x-mpeg
Related posts
标签: Java
如果文件名本身就有加号,那该如何处理?
Reply
lizongbo reply on 四月 22nd, 2009:
加号本身就会自动被编码成%2B了阿。
我的意思是,如果文件名本身就包括加号,比如原来的文件名是“测试+有加号 空格.doc”,你这样子处理,岂不是变成“测试 有加号 空格.doc”了吗?
Reply
lizongbo reply on 四月 26th, 2009:
我替换的是加号,而不是%2B。是先进行URLEncode,得到的内容里已经没有原始的加号了,只有表示空格的加号,此时再进行的替换操作。文中代码已经写明。