Сделать файл открытым в браузере, а не загружать его
У меня есть проект MVC, который отобразит некоторые документы для пользователей. Файлы хранятся в памяти Azure blob.
В настоящее время документы извлекаются из следующего действия контроллера:
[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")]
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
// get byte array from blob storage
byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
string mimeType = "application/octet-stream";
return File(doc, mimeType, fileName);
}
Прямо сейчас, когда пользователь нажимает на ссылку, как показано ниже:
<a target="_blank" href="#" onclick="location.href='http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf
Затем файл загружается в папку загрузки браузера. То, что я хотел бы сделать (и я думал, что это поведение по умолчанию), - это просто, чтобы файл просто отображался в браузере.
Я попытался изменить тип mimetype и сменить тип возвращаемого значения на FileResult вместо ActionResult, причем безрезультатно.
Как я могу сделать отображение файла в браузере вместо загрузки?
'; return false;
Ответы
Ответ 1
Благодаря всем ответам решение было комбинацией всех из них.
Во-первых, поскольку я использовал byte[]
, необходимо, чтобы действие контроллера было FileContentResult
не просто FileResult
. Нашел это благодаря: В чем разница между четырьмя результатами файлов в ASP.NET MVC
Во-вторых, тип mime должен быть НЕ octet-stream
. Предположительно, использование потока заставляет браузер просто загружать файл. Мне пришлось изменить тип application/pdf
. Мне нужно будет изучить более надежное решение для обработки других типов файлов /mime.
В-третьих, мне пришлось добавить заголовок, который изменил значение content-disposition
на inline
. Используя этот пост, я понял, что мне пришлось изменить свой код, чтобы предотвратить дублирование заголовков, поскольку для размещения контента уже установлено значение attachment
.
Успешный код:
public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName)
{
byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName);
string mimeType = "application/pdf"
Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName);
return File(doc, mimeType);
}
Ответ 2
Похоже, что кто-то еще задал подобный вопрос некоторое время назад:
как заставить PDF файлы открываться в браузере
С ответом, говорящим, что вы должны использовать заголовок:
Content-Disposition: inline; filename.pdf
Ответ 3
Браузеры должны принять решение о загрузке или отображении на основе типа mime.
Попробуйте следующее:
string mimeType = "application/pdf";
Ответ 4
Просто верните PhysicalFileResult и используйте метод HttpGet, URL откроет PDF файл
public ActionResult GetPublicLink()
{
path = @"D:\Read\x.pdf";
return new PhysicalFileResult(path, "application/pdf");
}