人們常說:做開發就像做那個什么,要滿足客戶的各種要求 ... ... 這句話一直記憶深刻,不過可能我運氣太好,遇到的客戶要求不多都能滿足,至少不會故意用些邊界條件來搞點花花出來。
而我現在遇到的問題是,測試想盡辦法用邊界條件來測這些程序,這是他們的責任,有時真的被搞得焦頭爛額。比如界面上有個文檔要下載成 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 里面也沒找到,不知道那篇文章的作者是如何發現的,人才啊。
Powered by: BlogJava Copyright © Rosen