Подтвердить что ты не робот

Сделать файл открытым в браузере, а не загружать его

У меня есть проект 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;
4b9b3361

Ответ 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);
} 

Ответ 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");
}