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 шт):
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 два апострофа, а не кавычки.
Вот еще полезная ссылка.