[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#]下载文件时中文文件名出现乱码

原文地址:https://www.cnblogs.com/petewell/p/11516548.html

时间: 2024-10-21 07:48:42

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

下载文件时,ie中文名乱码

  response.addHeader("Content-disposition",          "attachment; filename=" + new String(file.getName().getBytes("GBK"), "ISO8859-1"));

通过freemarker出word的技术解决方案_通过点击一个按钮临时实现生成一个word,解决出word时中文文件名乱码问题,解决打开出word时打开的word出现问题的问题,出图片,解决动态列表

 通过freemarker制作word比较简单 步骤:制作word模板.制作方式是:将模板word保存成为xml----在xml的word模板中添加相应的标记----将xml的word文件的后缀名改成ftl文件 详细步骤如下: 模板制作(将要动态显示的数据打上标记,这个标记是freemarker中的EL标记,要注意的是,要控制值为空的情况,下面${(site.wzmc)?default("")}标识当网站名称为空的时候显示空值,如果这里如果不做控制,在实际项目中会显示错误!) 另外

低版本ie保存文件时,文件名过长被截断

在工作中有一个下载文件的功能,遇到一个低版本ie保存文件时,文件名过长被截断的问题. asp.net MVC下载文件代码: 1 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(downloadFilePath); 2 request.KeepAlive = false; 3 WebResponse response = request.GetResponse(); 4 Stream stream = response.GetR

正确处理下载文件时HTTP头的编码问题(Content-Disposition)

转自:https://blog.robotshell.org/2012/deal-with-http-header-encoding-for-file-download/ 最近在做项目时遇到了一个 case :需要实现一个强制下载功能(即强制弹出下载对话框,阻止浏览器尝试解析显示某些文件格式),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可

asp.net mvc5 下载文件方法

控制器自带的 FileContentResult 可以让我们很方便的返回文件到服务端,减少了很多步骤.用于下载文件的时候,像视频.文本.图片这种浏览器支持的文件,默认就会被浏览器打开.这时候想让它变成下载,还需要设置一下响应头,告诉浏览器如何处理才行. public ActionResult DownLoadFile(String path, string fileName, string contentType) { Response.AddHeader("Content-Dispositio

【转】正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

最近在做项目时遇到了一个 case :需要实现一个强制在浏览器中的下载功能(即强制让浏览器弹出下载对话框),并且文件名必须保持和用户之前上传时相同(可能包含非 ASCII 字符). 前一个需求很容易实现:使用 HTTP Header 的 Content-Disposition: attachment 即可,还可以配合 Content-Type: application/octet-stream 来确保万无一失.而后一个需求就比较蛋疼了,牵扯到 Header 的编码问题(文件名是作为 filena

实现在 .net 中使用 HttpClient 下载文件时显示进度

原文:实现在 .net 中使用 HttpClient 下载文件时显示进度 在 .net framework 中,要实现下载文件并显示进度的话,最简单的做法是使用 WebClient 类.订阅 DownloadProgressChanged 事件就行了. 但是很可惜,WebClient 并不包含在 .net standard 当中.在 .net standard 中,要进行 http 网络请求,我们用得更多的是 HttpClient.另外还要注意的是,UWP 中也有一个 HttpClient,虽然

解决下载文件时,多种浏览器下中文乱码问题

<?php $ua = $_SERVER["HTTP_USER_AGENT"]; $filename = "中文 文件名.txt"; $encoded_filename = urlencode($filename); $encoded_filename = str_replace("+", "%20", $encoded_filename); header('Content-Type: application/octet

C# ASP 上传/下载文件

1.  上传文件前台页面 1 <div style="padding-left:20px;"> 2 <asp:FileUpload ID="FileUpload1" runat="server" style="width:400px;"/> 3 <asp:Button ID="Button1" runat="server" OnClick="Upl