[ASP.NET][C#]下载文件时中文文件名出现乱码

负责的网站在ASP.NET网页有一段下载Word/Excel文件的程序,最近使用者要求的文件名称内含繁体中文字,
同事用chrome/firefox浏览器测试下载都很正常显示,但用IE(版本11)开启时,却出现了乱码。


1.准备一个中文文件名的文件

分享图片

ASP.NET MVC

2.在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.执行下载

文件名不正常

分享图片

找到两个解法

  1. 将中文文件名用HttpUtility.UrlEncode以UTF8编码系统进行QP编码。
  2. 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#]下载文件时中文文件名出现乱码

相关文章
相关标签/搜索