2

我使用以下代码将文件从我的服务器发送到客户端:

Response.AppendHeader("content-disposition", "attachment; filename=" + FileName);
Response.ContentType = MimeType;
Response.WriteFile(PathToFile);
Response.End();

这工作正常。问题是,当我从 Internet Explorer 下载文件时,特殊字符(如丹麦语 æ、ø 和 å)会被错误解释。因此,我使用名称为“Test æøå file.txt”的文件下载为“Test æ_ø_Ã¥ f​​ile.txt”

我尝试将字节顺序标记添加到响应中:

byte[] BOM = { 0xEF, 0xBB, 0xBF };
Response.BinaryWrite(BOM);

并设置字符集:

Response.Charset = "UTF-8";
Response.ContentEncoding = System.Text.Encoding.UTF8;

但如果它有帮助,那就没有了。这似乎只是 Internet Explorer 中的问题。

4

3 回答 3

4

标头不使用内容的编码,因此更改内容编码无济于事。有一个为标头参数指定编码的标准,但它是相当新的,所以它不会在所有浏览器中得到完全支持:

http://greenbytes.de/tech/webdav/rfc5987.html

这是您对名称进行编码的方式:

string FileName = "Test æ ø å file.txt";

string name = String.Concat(Encoding.UTF8.GetBytes(FileName).Select(b => {
  if ((b >= 48 && b <= 57) || (b >= 65 && b <= 90) || (b >= 97 && b <= 122)) {
    return new String((char)b, 1);
  } else {
    return String.Format("%{0:x2}", b);
  }
}).ToArray());

Response.AppendHeader("content-disposition", "attachment; filename*=UTF-8''" + name);

以标题结尾的文本如下所示:

attachment; filename*=UTF-8''Test%20%c3%a6%20%c3%b8%20%c3%a5%20file%2etxt

注意:代码对除字母数字以外的所有字符进行编码。这可行,但并非所有其他字符都需要编码。在检查标准后,您可以改进代码以保留更多未编码的字符。

于 2013-01-21T07:57:43.837 回答
1

尝试指定特定的文件类型,如下所示(这是用于 excel 文件类型) -

Response.ContentType = "application/vnd.ms-excel";

请参阅强制下载文本响应的内容类型是什么?

于 2013-01-21T07:44:10.657 回答
0

解决 Internet Explorer 文件名问题要容易得多,您会在这里找到答案

您必须HttpUtility.UrlPathEncode(yourFileName)- 因为这会弄乱其他浏览器中的文件名,您必须检查浏览器 ( Request.Browser.Browser) 是否为 Internet Explorer(IE直到版本 10,Internet Explorer从版本 11)。

于 2015-12-11T11:24:29.687 回答