人们常说:做开发就像做那个什么,要满足客户的各种要求
...
...
这句话一直记忆深刻,不过可能我运气太好,遇到的客户要求不多都能满足,至少不会故意用些边界条件来搞点花花出来。
而我现在遇到的问题是,测试想尽办法用边界条件来测这些程序,这是他们的责任,有时真的被搞得焦头烂额。比如界面上有个文档要下载成
xml
格式,本来没什么麻烦的,但是这个文件名一旦包含些花花绿绿的符号就不好弄了,参看下图。
这真是让人哭笑不得,分号以后的花花符号不见了,扩展名也不见了。再来一个,看下图。
这个更牛,分号后面的字全部不见了,竟然下载文件名是
*.jsp
,我哭了,我怒了。不过没法,明显是自己的代码没考虑到这些符号花花,没进行边界条件测试,垂头丧气之后,还是得改。据我分析,应该是在下载的时候分号起到了分割属性的作用,例如
response.setContentType("application/x-msdownload;
charset=UTF-8");
中的分号设定了
ContentType
的字符集。那么按照常理,应该把文件名中的分号进行转义,比如
XML
中对
<
符号的转义,分号的转义实体编号是
;
,经过实验,转义以后还是无法识别,文件名成了
_59
。实在没法,
google
以后找到了如何在
PHP
下载文件名中解决乱码这篇文章,在这里,作者明确指出了应该对文件名进行
URL
编码,在经过一番折腾后,修改后的代码如下:
String clinet
=
request.getHeader("User-Agent");
if
(clinet.indexOf("MSIE")
>
0){
flowName
=
"attachment; filename=\""
+java.net.URLEncoder.encode(fileName, "utf-8")+
".xml\"";
}
else
{
flowName
=
"attachment; filename*=\"utf8''"
+java.net.URLEncoder.encode(fileName, "utf-8")+
".xml\"";
}
String content
=
"
xml格式内容.
"
;
response.setContentType("application/x-msdownload; charset=UTF-8");
response.setHeader("Content-Disposition"
,flowName);
out.print(content);
这样就可以正常下载带花花符号的文件名了。令人感慨的是,为了这些花花符号,我不得不去写代码分析浏览器的类型,在这里我很粗旷的支持了两种浏览器,
IE
和
FF
,如果是其他类型的浏览器,统一按
FF
处理,至于为何这样写,可以参考上面提供的文章。这里有两个疑问:
1.
花了很长时间来找
RFC
关于
Content-Disposition
设置的描述,没发现明确要求用
URL
进行编码(现在看来我觉得切入点找错了,应该从
'
下载过程本身就是一个
URL
请求
'
切入,参考
http://www.blooberry.com/indexdot/html/topics/urlencoding.htm
);
2.attachment;
filename*=utf8''
这里为何要这样设置,我在
FF
的
KB
里面也没找到,不知道那篇文章的作者是如何发现的,人才啊。
请注意!引用、转贴本文应注明原作者:Rosen Jiang 以及出处:
http://www.blogjava.net/rosen