Отличный вопрос ... и заслуживает более подробной информации. Я оказываюсь здесь в результате интересной ситуации. Мы доставляли некоторые вложения в формате PDF через среду MVC3 / C #. Наш код был выпущен, и мы начали получать ответы от наших клиентов о том, что загрузка происходила странно, когда они использовали Chrome, и тип файла преобразовывался в «pdf-, attachment.pdf-, attachment». Да ... ты понял ... все это. Таким образом, можно переписать его так, чтобы он был просто «pdf», и файл все равно сохранялся бы неповрежденным, но что за беспорядок!
Итак, чтобы описать исходную ситуацию, мы устанавливали заголовок «Content-Disposition», а затем возвращали FileContentResult ...
var cd = new System.Net.Mime.ContentDisposition
{
FileName = result.Attachment.FileName,
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName);
Казалось, хорошо. Работал нормально в IE. Поэтому я провел небольшое исследование и попытался реализовать FileStreamResult (оставив установщик Content-Disposition):
MemoryStream dataStream = new MemoryStream();
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length);
dataStream.Position = 0;
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName));
Это исправило проблему в Chrome! Хммм ... но почему, черт возьми, я должен взять мой совершенно хороший байтовый массив и передать его в поток, а затем вернуть через него, чтобы заставить имя файла работать правильно?
Затем появился скрипач.
С FileContentResult я получил 2 Content-Dispositions в заголовке. С FileStreamResult я получил 1.
FileContentResult добавляет заголовок Content-Disposition при предоставлении имени файла, а Chrome рассматривает кратные значения этого заголовка как ошибку.
Странная реакция ... но определенно это хорошо знать.
System.Web.MimeMapping.GetMimeMapping(filename)
чтобы собрать тип MIME, если вы не можете легко получить к нему доступ.File
результата означает установку егоFileDownloadName
свойства, которое устанавливаетContent-Disposition
заголовки для вас. И он правильно поддерживает имена файлов utf-8, что не являетсяContentDisposition
вспомогательным классом (см. Мой комментарий здесь для более подробной информации).