负责的网站在ASP.NET网页有一段下载Word/Excel文件的程序,最近使用者要求的文件名称内含繁体中文字,
同事用chrome/firefox浏览器测试下载都很正常显示,但用IE(版本11)开启时,却出现了乱码。
1.准备一个中文文件名的文件
ASP.NET MVC2.在HomeControler中加入下载程序Download
public ActionResult Download() { //文件位置 string filepath = @"E:testWebApplication1中文文件名.docx"; //文件名称 string filename = Path.GetFileName(filepath); //读成串流 Stream sfilestream = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.Read); //回传出文件 return File(sfilestream, "application/vnd.openxmlformats-officedocument.wordprocessingml.document", filename); }
3.执行下载
文件名正常显示中文!
换上ASP.NET Web Form
4.先增一支Download.aspx
在Page load加入下载程序
protected void Page_Load(object sender, EventArgs e) { string filepath = @"E:testWebApplication1中文文件名.docx"; string fileName = Path.GetFileName(filepath); HttpContext.Current.Response.AppendHeader("content-disposition", "attachment;filename=" + fileName); HttpContext.Current.Response.ContentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; HttpContext.Current.Response.WriteFile(filepath); HttpContext.Current.Response.End(); }
5.执行下载
文件名不正常
找到两个解法
- 将中文文件名用HttpUtility.UrlEncode以UTF8编码系统进行QP编码。
- HeaderEncoding编码改为BIG5。
(1)将中文文件名用HttpUtility.UrlEncode以UTF8编码系统进行QP编码
string fileName = HttpUtility.UrlEncode(Path.GetFileName(filepath)); //string fileName = Path.GetFileName(filepath);
HttpUtility.UrlEncode默认会以UTF8的编码系统进行QP(Quoted-Printable)编码,可以直接显示的7 Bit符(ASCII)就不用特别转换。
- 编码前:中文档名.docx
- 编码后:%e4%b8%ad%e6%96%87%e6%aa%94%e5%90%8d.docx
除了标准ASCII,其他都会用UTF8进行编码送到前端浏览器。
https://mothereff.in/utf-8
文件名可以正常显示中文了!
(2)HeaderEncoding编码改为BIG5
增加一行设定HeaderEncoding的程序,因为服务器都是繁体中文,默认Encoding.Default = BIG5
HttpContext.Current.Response.HeaderEncoding = System.Text.Encoding.Default;
默认HttpContext.Current.Response.HeaderEncoding是UTF8,将编码改为BIG5也可以解决中文文件名问题
都已经是UTF8编码的网页了,为什么还得要将HeaderEncoding编码改为繁体中文操作系统的BIG5才能解决???
进一步搜寻到保哥、黑暗大文章,看起来似乎与浏览器支持到哪一种Content-Disposition标准有关(RFC2045、2183、5987)。
好,先到此打住,来看奥运了!以后有时间再继续深入调查。
小结:
- 因为系统被要求要支持多国语系,暂时我们选择第一种解法,以后出现蝌蚪文还是火星文就不怕了。
- ASP.NET MVC已经解决了文件名有中文码问题了。
参考:
HttpResponse 类
HttpUtility.UrlEncode
HttpResponse.HeaderEncoding
KB-Open And Download File In Chinese Filename
ASP.NET 如何设定强制下载文件并正确处理中文文件名的问题
How to encode the filename parameter of Content-Disposition header in HTTP?
原文:大专栏 [ASP.NET][C#]下载文件时中文文件名出现乱码