У меня была похожая проблема. Вы должны использовать 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);
Редактировать
Я внимательно прочитал спецификацию. Прежде всего 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 охватывает все.