使用 HttpResponse 在 C# 中下载带有非英文字符的文件



我正在尝试构建一个功能来下载 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

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

最新更新