[ASP.NET][C#]下载文件时中文文件名出现乱码
负责的网站在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#]下载文件时中文文件名出现乱码
原文地址:https://www.cnblogs.com/petewell/p/11516548.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法