文件的上傳下載,上傳的時候沒有出現問題,可是使用火狐瀏覽器進行下載的時候出現了文件名的不完整, 空格不識別的狀況。 這種狀況下是在下載的時候對response的處理。 //將文件名作一個字符格式處理,轉化成能夠被火狐瀏覽器能夠識別的文件名(例如部分中文) String fileName = new String(file.getFileName().getBytes("UTF-8"), "ISO-8859-1"); //設置響應頭,加\「」能夠處理文件名中中英文交互的狀況 response.setHeader("Content-disposition","attachment;filename="" + fileName + """);chrome
其中過程當中看到一篇博客特別好 http://blog.csdn.net/zsmj_2011/article/details/47071331瀏覽器
博客部分:app
最近作項目,採用Spring MVC作控制層,下載文件的文件名老是在主流瀏覽器上顯示亂碼,Firfox不是亂碼了,IE下又成了亂碼。也是煩,IE老是獨樹一幟,沒辦法,只能讓程序去適應,在網上也搜索了不少,可是解決的不理想,主要是IE11做爲主流瀏覽器後,不少人以前提出的方案都失效了。 簡單來講,以前使用request獲取header中的user-agent,經過MSIE關鍵字來判斷是不是IE瀏覽器,若是是IE瀏覽器,使用utf-8對文件名編碼就能夠了。然而,IE11的user-agent已經沒有了MSIE關鍵字了,下面就是IE11的request header:ide
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; LCJB; rv:11.0) like Gecko 1 能夠看出,MSIE關鍵字已經沒有,可是我們還可使用Trident關鍵字來判斷 然而,我在使用win10上的Edge瀏覽器進行下載時,仍然是亂碼,仔細看,原來Edge瀏覽器的user-agent又發生了變化,MSIE和Trident關鍵字都沒有了,增長了Edge關鍵字,當前我用電腦仍是win8,這裏就不貼出最新的Edge瀏覽器的request header了,感興趣的能夠進開發者模式看一下。編碼
終極解決方案.net
好了,咱們如今須要使用Trident和Edge關鍵字來判斷是不是微軟的瀏覽器(微軟拋棄了IE,開始使用Edge了),代碼以下:code
public class HttpUtils { private static String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};blog
public static boolean isMSBrowser(HttpServletRequest request) { String userAgent = request.getHeader("User-Agent"); for (String signal : IEBrowserSignals) { if (userAgent.contains(signal)) return true; } return false; }
} 1 2 3 4 5 6 7 8 9 10 11 12 那麼在下載時,首先判斷是不是微軟的瀏覽器,若是是,用utf-8對文件名進行編碼,若是不是,使用萬能解決亂碼代碼:utf-8
new String(fileName.getBytes("UTF-8"), "ISO-8859-1") 1 那麼我們總結一下,最終的下載代碼以下:開發
response.setContentType("application/octet-stream"); boolean isMSIE = HttpUtils.isMSBrowser(request); if (isMSIE) { fileName = URLEncoder.encode(fileName, "UTF-8"); } else { fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); } response.setHeader("Content-disposition", "attachment;filename="" + fileName + """); //剩下的就是將文件流輸出到response 1 2 3 4 5 6 7 8 9 這樣就能夠在目前IE8-IE十一、Edge、Firefox和chrome瀏覽器下載文件時,中文字符再也不亂碼了。
Firefox下載英文+中文組合的文件名的問題
另外,有一個須要注意的地方就是這句話:
response.setHeader("Content-disposition","attachment;filename="" + fileName + """); 1 設置response的Content-disposition項時,filename的值要加上雙引號,若是不加雙引號,在Firefox下載文件時,若是文件名是英文+中文的組合,好比:dota2的新手攻略.docx,這個文件在Firefox下載時,下載下來的文件名只有dota2了。只有加了雙引號後,文件名才和代碼設置的文件名一致。由於這個雙引號是在字符串裏,所需須要加反斜槓\來進行轉義。