我正在尝试构建一个功能来下载 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");
下载的文件名为
Ð_оÑ_ква
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
我终于找到了解决方案.
问题从来都不在上面的代码上,它总是工作正常。 实际问题在前端,其中编码中接收的内容处置标头未解码,当我提出问题时,我跳过了这一部分.
我想删除这个问题,但保留它,以便如果有人犯了和我一样愚蠢的错误,可能会更早意识到它,而不是浪费时间寻找从未存在过的问题的解决方案。