HttpListener как вернуть файл с русским названием

сервер должен вернуть файл на скачивание. с англ названиями все ок, с русскими не могу добиться присвоения нормального назания.
пример:

byte[] fromb64 = Convert.FromBase64String(file);
string fname = Encoding.UTF8.GetString(fromb64);

Console.WriteLine("Decoded base64 = " + fname);// тут все нормально

response.AddHeader("Content-disposition", "attachment; filename=" + Path.GetFileName(fname));// а тут нет. получается бурда из символов
response.ContentLength64 = file_Stream.Length;
response.SendChunked = false;
response.ContentType = System.Net.Mime.MediaTypeNames.Application.Octet;

пробовал прямо подставить

response.AddHeader("Content-disposition", "attachment; filename=\"файл.jpg\"");

получаю D09;.jpg

есть решение?


Ответы (1 шт):

Автор решения: aepot

HTTP заголовки поддерживают только ASCII кодировку.

Согласно RFC-2183 такой заголовок, включающий в себя не-ASCII символы, должен быть закодирован согласно RFC-2184.

Parameter values longer than 78 characters, or which contain non-ASCII characters, MUST be encoded as specified in [RFC 2184].

Сам же RFC-2184 устарел и заменен на RFC-2231.

Например, если имя файла "картинка.jpg", и вы кодируете с помощью UTF-8, то получится так

string fileName = "картинка.jpg";
string fileNameUrlEncoded = HttpUtility.UrlEncode(fileName, Encoding.UTF8);
response.AddHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileNameUrlEncoded);

На выходе получится

Content-Disposition: attachment; filename*=UTF-8''%D0%BA%D0%B0%D1%80%D1%82%D0%B8%D0%BD%D0%BA%D0%B0.jpg

После UTF-8 два апострофа, а не кавычки.

Вот еще полезная ссылка.

→ Ссылка