Відмінне запитання ... і заслуговує на більше деталей. Я опиняюся тут внаслідок цікавої ситуації. Ми доставляли деякі вкладені файли у форматі 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 заголовки вмісту у заголовку. З FileStreamResult я отримав 1.
FileContentResult додає заголовок Content-Disposition, коли надає Ім'я файлу, а Chrome розглядає кратність цього заголовка як помилку.
Дивна реакція ... але, безумовно, таку, яку добре знати.
System.Web.MimeMapping.GetMimeMapping(filename)
для збору типу mime, якщо ви не можете легко отримати доступ до нього.