【发布时间】: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