摘要:在項目中發(fā)現(xiàn),使用下載中文名文件的時候,下載的文件名是亂碼的問題。但是這個問題在,,中是沒有的。原先以為是的,但是細細研究之下你會發(fā)現(xiàn)這個簡單的文件下載問題在協(xié)議里經(jīng)歷了多少波折。
在項目中發(fā)現(xiàn),使用Safari下載中文名文件的時候,下載的文件名是亂碼的問題。但是這個問題在IE,F(xiàn)irefox,Chrome中是沒有的。原先以為是Safari的bug,但是細細研究之下你會發(fā)現(xiàn)這個簡單的文件下載問題在HTTP協(xié)議里經(jīng)歷了多少波折。
研究的結(jié)果也不是我自己寫的,具體可以看這兩篇文章
Serving file downloads with non-ascii
正確處理下載文件時HTTP頭的編碼問題(Content-Disposition)
這里直接貼出java代碼
/** ** 瀏覽器下載文件時需要在服務端給出下載的文件名,當文件名是ASCII字符時沒有問題 * 當文件名有非ASCII字符時就有可能出現(xiàn)亂碼 * * 這里的實現(xiàn)方式參考這篇文章 * http://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ * * 最終設置的response header是這樣: * * Content-Disposition: attachment; * filename="encoded_text"; * filename*=utf-8""encoded_text * * 其中encoded_text是經(jīng)過RFC 3986的“百分號URL編碼”規(guī)則處理過的文件名 ** @param response * @param filename * @return */ public static void setFileDownloadHeader(HttpServletResponse response, String filename) { String headerValue = "attachment;"; headerValue += " filename="" + encodeURIComponent(filename) +"";"; headerValue += " filename*=utf-8""" + encodeURIComponent(filename); response.setHeader("Content-Disposition", headerValue); } /** ** 符合 RFC 3986 標準的“百分號URL編碼” * 在這個方法里,空格會被編碼成%20,而不是+ * 和瀏覽器的encodeURIComponent行為一致 ** @param value * @return */ public static String encodeURIComponent(String value) { try { return URLEncoder.encode(value, "UTF-8").replaceAll("+", "%20"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); return null; } }
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/66214.html
摘要:瀏覽器下載代碼如下通過循環(huán)將讀入的文件的內(nèi)容輸出到瀏覽器中如果文件名為中文,上面的代碼下載的文件名會亂碼。解決中文亂碼方法拿到瀏覽器請求的判斷是否包含,是則直接講文件名轉(zhuǎn)換為,否則使用轉(zhuǎn)換。 場景描述: 由于項目需求,需要支持瀏覽器下載文件,比如招聘網(wǎng)站的在線簡歷下載。 瀏覽器下載代碼如下: public static void downloadFile(File file,...
摘要:什么是對象響應由狀態(tài)行實體內(nèi)容消息頭一個空行組成。為什么使用方法能夠正常向瀏覽器輸出中文呢你好呀我是中國這句代碼在轉(zhuǎn)成數(shù)組的時候默認查的是編碼,而你好呀我是中國支持編碼,所以可以正常顯示出來。 response、request對象 Tomcat收到客戶端的http請求,會針對每一次請求,分別創(chuàng)建一個代表請求的request對象、和代表響應的response對象 既然request對象...
摘要:因此導致亂碼的真正原因就是各平臺間對標準實現(xiàn)不一致包括實現(xiàn)的時間先后不同,以及所代表含義不同。日本幾家公司各自定義了一套標準,用兩個字節(jié)表示符號,日本電腦系統(tǒng)的一種編碼編碼是從到。在上找到了與標準的對應關系。 歡迎關注個人網(wǎng)站:http://www.iamaddy.net/2016/07/emoji-unicode-parser/ 前言 這是一個由亂碼引發(fā)的故事。抱歉我暫時找不到更加慘...
閱讀 1972·2021-11-23 10:03
閱讀 4130·2021-11-22 09:34
閱讀 2466·2021-10-08 10:05
閱讀 2247·2019-08-30 15:53
閱讀 1686·2019-08-30 13:56
閱讀 1149·2019-08-29 16:52
閱讀 1102·2019-08-26 13:31
閱讀 3346·2019-08-26 11:45