【问题标题】:Download file with non-english character in C# using HttpResponse使用 HttpResponse 在 C# 中下载具有非英文字符的文件
【发布时间】:2020-10-14 03:03:47
【问题描述】:

我正在尝试构建一个功能来下载 C# 中的 csv 文件。

当文件名有非英文字符时,下载的文件似乎没有正确的名称。但是在网络选项卡中,响应标头具有与代码中给出的相同的Content-Disposition 值。

示例代码

private void PopulateCsvInResponse(MemoryStream csvData, string fileName)
{
    HttpResponse response = HttpContext.Current.Response;
    response.Clear();
    //actual file name "Москва.csv"
    response.AddHeader("Content-Disposition", "attachment; filename=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv");
    byte[] byteArray = csvData.ToArray();
    response.AddHeader("Content-Length", byteArray.Length.ToString());
    response.ContentType = "text/csv; charset=utf-8";
    response.BinaryWrite(byteArray);
    response.Flush();
    response.Close();
}

例如文件名为Москва.csv
UTF-8 编码名称:%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv.

我尝试过的事情

替换Content-Disposition标头

尝试 1

response.AddHeader("Content-Disposition", 
   "attachment; filename=Москва.csv");   

下载的文件名是

Ð_оÑ_ква


尝试 2

response.AddHeader("Content-Disposition", 
   "attachment; filename=\"%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv\"; filename*=UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv");

下载的文件名是

_%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv_; filename_


尝试 3

response.AddHeader("Content-Disposition", 
    "attachment; filename=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv");

下载的文件名是

%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv


尝试 4

response.AddHeader("Content-Disposition", 
    "attachment; filename*=UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv");

下载的文件名是

UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv

【问题讨论】:

  • 我看到你的问题,你的代码以数字开头,编译器错误
  • 这些是行号@TheGeneral。它们不是代码的一部分。如果是编译错误,则代码根本不会运行。
  • @RobertHarvey 我打算编辑这个问题,但看起来工作量很大
  • 你建议如何编辑它?行号仅供参考;它们对问题没有负面影响。
  • 你能不能只尝试 UTF-8 部分,在问题的第 2 点:attachment; filename*=UTF-8''%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0.csv

标签: c# csv encoding httpresponse content-disposition


【解决方案1】:

我终于找到了解决办法。
问题从来都不是上面的代码,它总是工作正常。 实际问题出在前端,encode 中接收到的 content disposition 标头没有被解码,当我提出问题时我跳过看这部分。
我想删除这个问题,但保留它,以便如果有人犯了和我一样的愚蠢错误,可能会更早意识到这一点,而不是浪费时间为从未存在的问题寻找解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    • 2012-08-19
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多