Я использую объект HttpContext, реализованный в ребенке HttpHandler для загрузки файла, когда у меня есть символы неASCII в имени файла, это выглядит странным в IE, тогда как это выглядит хорошо в Firefox.
ниже код:-
context.Response.ContentType = ".cs";
context.Response.AppendHeader("Content-Length", data.Length.ToString());
context.Response.AppendHeader("Content-Disposition", String.Format("attachment; filename={0}",filename));
context.Response.OutputStream.Write(data, 0, data.Length);
context.Response.Flush();
когда я предоставляю 'ä' 'ß' 'à ¶' 'ü' 'à ³' 'ß' 'ä' 'à ¶' 'ü' 'à ³', в поле имени файла он выглядит по-другому, чем, что я имею в имени файла, которое он выглядит хорошо в Firefox. добавление EncodingType и набора символов было бесполезно.
В т.е. это - 'ʸ ''ä ''ච''ü ''à³ ''ʸ ''ä ''ච_'à'¦ƒ¦¼' ³', и в Firefox это - 'ä' 'ß' 'à ¶' 'ü' 'à ³' 'ß' 'ä' 'à ¶' 'ü' 'à ³'.
Какая-либо Идея, как это может быть зафиксировано?
У меня была похожая проблема. Вам нужно использовать HttpUtility.UrlEncode или Server.UrlEncode для кодирования имени файла. Также я помню, что firefox не нуждался в этом. Более того, он портит имя файла при url-кодировании. Мой код:
// IE needs url encoding, FF doesn't support it, Google Chrome doesn't care
if (Request.Browser.IsBrowser ("IE"))
{
fileName = Server.UrlEncode(fileName);
}
Response.Clear ();
Response.AddHeader ("content-disposition", String.Format ("attachment;filename=\"{0}\"", fileName));
Response.AddHeader ("Content-Length", data.Length.ToString (CultureInfo.InvariantCulture));
Response.ContentType = mimeType;
Response.BinaryWrite(data);
Edit
Я прочитал спецификацию более внимательно. Во-первых, в RFC2183 говорится, что:
Текущая грамматика [RFC 2045] ограничивает значения параметров (и, следовательно, имена файлов Content-Disposition) US-ASCII.
Но затем я нашел ссылки на то, что [RFC 2045] устарел и нужно ссылаться на RFC 2231, в котором говорится:
Звездочки ("*") используются повторно, чтобы обеспечить индикатора того, что язык и информация о языке и наборе символов присутствует и используется кодировка. Одиночная кавычка ("'") используется для разграничения информацию о наборе символов и языке в начале параметра значение. Знаки процента ("%") используются в качестве флаг кодировки, что согласуется с RFC 2047.
Это означает, что вы можете использовать UrlEncode для символов, не являющихсяascii, при условии, что вы указываете кодировку, как указано в rfc. Вот пример:
string.Format("attachment; filename=\"{0}\"; filename*=UTF-8''{0}", Server.UrlEncode(fileName, Encoding.UTF8));
Обратите внимание, что filename
включено в дополнение к filename*
для обратной совместимости. Вы также можете выбрать другую кодировку и соответствующим образом изменить параметр, но UTF-8 покрывает все.