1. 程式人生 > >檔案下載檔名亂碼的幾個問題

檔案下載檔名亂碼的幾個問題

Java Web後端做檔案的下載,各個瀏覽器之間有相容性問題,下載檔案的檔名可能有亂碼,下面總結幾個亂碼問題和常見解決辦法:

firefox檔名亂碼的問題:

一般下載檔案,都會指明Content-disposition,形如下

response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".txt");

但是這在firefox下,下載的檔名還是會亂碼,這是因為firefox嚴格按照RFC的規定實現,對應的constent-disposition,是如下的格式:

response.setHeader("Content-disposition", "attachment;filename*=utf-8'zh_cn'"+URLEncoder.encode(fileName,"UTF-8")+".txt");

所以對於不同的瀏覽器,就有判斷了:

String userAgent=(String)request.getHeader("USER-AGENT"); 
if(useAgent.toLowerCase().contain("firefix")){
    response.setHeader("Content-disposition", "attachment;filename*=utf-8'zh_cn'"
+URLEncoder.encode(fileName,"UTF-8")+".txt"); }else{ response.setHeader("Content-disposition", "attachment;filename="+URLEncoder.encode(fileName,"UTF-8")+".txt"); }

中英文組合檔名在firefox下載顯示不全

解決辦法是在fileName外面包一層"然後因為引號轉移,需要加斜槓:

response.setHeader("Content-disposition","attachment;filename=\"" + fileName + "\""
);

空格encode之後變成+號的問題

需要在encode之後,手動對+號替換,替換回urlencode的空格,也就是%20

fileName.replaceAll("+","%20");

總結

以上列舉出來的,都是一些小技巧,我寫完後覺得,如果要徹底解決檔名亂碼的問題,最好的辦法,還是認真對每一個瀏覽器做好針對性的解決辦法,做成一個工具類。
其次是我上面寫到的還是太少,更多內容,更細緻的內容,還請看參考部分的部落格,質量都很高

參考