首先說明下:我的解決方法不一定適用於其他遇到該問題的人,因為情況多種多樣,適合我的方法不一定適合別人,就像我在遇到問題時查到別人的解決方案放到我的代碼里卻不管用,所以這個方法僅供參考
這兩天做了一個導出數據到Excel功能,用NPOI導出,但是在最后步驟出了一點小岔子,導出文件的名稱在火狐里面顯示的是亂碼,在谷歌和IE里面均正常,這尼瑪~~~瞬間想把火狐給千刀萬剮了有木有!!當然光生氣是沒什么用的,問題總是要解決的。雖然用戶基本不用火狐瀏覽網站,但是留這么一個問題在也不合適是不是,所以就找原因,csdn上一位博主寫了一個解決辦法(傳送門),但是我用過后發現不管用,不知道是不是我的情況特殊,也有在百度上看到火狐官方的回答是讓設置文件編碼,不過也沒用,后來在百度知道上看到另一個大神說不需要編碼,於是試了一下,發現火狐是OK了,但是谷歌和IE卻抽了,無奈只好做了一個判斷,對火狐特殊處理,具體代碼如下:
1 //這里判斷使用的瀏覽器是否為Firefox,Firefox導出文件時不需要對文件名顯示編碼,編碼后文件名會亂碼 2 //但是IE和Google需要編碼才能保持文件名正常 3 if (baseContext.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1) 4 { 5 baseContext.Response.AddHeader("Content-Disposition", "attachment;filename=" 6 + sFileName); 7 } 8 else 9 { 10 baseContext.Response.AddHeader("Content-Disposition", "attachment;filename=" 11 + System.Web.HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8)); 12 }
遇到同樣問題的朋友可以試試
~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~
解決這個問題之后,滿心歡喜,但是我沒想到后面還有更大的坑在等着我去跳,火狐里面中文倒是可以了,由於我們網站是多語系,有簡繁英越四個語言,導出英文和越文時,字之間的空格都顯示成了+號,並且在IE和谷歌里面越語的時候也會出啊先瞬間就傻眼了,這是什么玩意兒?無奈只好又查資料,同事幫我找到一個解決方案,具體地址在這里,原因是經過HttpUtility.UrlEncode方法加密過文件名后該方法將空格替換成了+號,用%20替換掉就可以正常顯示了,但是這個方法在IE和谷歌里面可以解決問題,在火狐里面仍然無效,用%20替換+后輸出的就是%20,並不會顯示為空格,真心是給火狐跪了啊,各種糾結,最后還是那個同事幫我找到一篇一個Java工程師寫的解決方案,具體地址在這里,於是抱着試試看的態度用C#試了下,結果完美解決所有語言的亂碼問題,唉,真是被火狐搞死了,到此這個功能總算完善了,最后還是把具體的代碼發出來吧
string sFileName = "XXXXXX.xls";
if (baseContext.Request.ServerVariables["http_user_agent"].ToString().IndexOf("Firefox") != -1)
{
sFileName = "=?UTF-8?B?" + Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(sFileName)) + "?=";
}
else
{
sFileName = System.Web.HttpUtility.UrlEncode(sFileName, System.Text.Encoding.UTF8);
sFileName = sFileName.Replace("+", "%20");
}
baseContext.Response.AddHeader("Content-Disposition", "attachment;filename=" + sFileName);
baseContext.Response.AddHeader("Content-Length", ms.Length.ToString());
baseContext.Response.AddHeader("Content-Transfer-Encoding", "binary");
baseContext.Response.ContentType = "application/octet-stream;charset=utf-8";
baseContext.Response.ContentEncoding = System.Text.Encoding.UTF8;
baseContext.Response.BinaryWrite(ms.ToArray());
