MVC 5, как заставить браузер открывать файл PDF - PullRequest
0 голосов
/ 24 мая 2018

Я провожу весь день, пытаясь заставить браузер открывать PDF-файлы, а не загружать его с помощью System.Web.Mvc.FileResult, и я сделал это по старинке System.Web.Response, как это:

Контроллер

 //StaticData.ReportsTemp  it's my  type of Dictionary<string,object>
public async Task<ActionResult> GenerateReport() {
    //some code 
    var tempGuid = Guid.NewGuid().ToString();
    StaticData.ReportsTemp[tempGuid] = File(strem, obj.MediaType, obj.name);
    return Content(opertionGuid);
}

public FileResult DownloadReport(string fileName) {
    FileResult result = null;
    FileStreamResult st = null;
    if (StaticData.ReportsTemp.ContainsKey(fileName)) {
        st = StaticData.ReportsTemp[fileName] as FileStreamResult;
        result = st;
        StaticData.ReportsTemp.Remove(fileName);
        if (st.ContentType == System.Net.Mime.MediaTypeNames.Application.Pdf || 1 == 1) { //Old fashion way
            byte[] buff = null;
            System.IO.BinaryReader br = new System.IO.BinaryReader(st.FileStream);
            buff = br.ReadBytes((int) st.FileStream.Length);
            Response.BinaryWrite(buff);
            Response.AddHeader("content-length", buff.Length.ToString());
            Response.ContentType = st.ContentType;
            Response.AddHeader("Content-Disposition", "inline; filename=" + st.FileDownloadName + ";");
            return null;
        }
    }
    return result;
}

JS

function onSuccess(data, status, xhr) {
    window.open("@Url.RouteUrl(new { Controller = "Main", Action = "DownloadReport" })?filename=" + xhr.responseText,'_brank');
}

Мой процесс загрузки разделен на два этапа:

  1. 1) Я создаю отчет, создаю FileStremResult, сохраняю его в словарь StaticData.Reports и возвращаю ключ словаря клиенту
  2. 2), используя ключ словаря, полученный на шаге 1. Я вызываю действие Download, которое возвращает FileStremResult из StaticData.Словарь отчетов

PDF открываются в браузере, а все остальные файлы по-прежнему просто загружаются.

Но мне все еще интересно, есть ли другой способ добиться этого?Есть ли способ сделать это с классами System.Web.Mvc ActionResult?

1 Ответ

0 голосов
/ 24 мая 2018

Я не знаю, как работает StaticData класс.Обычно вы можете вернуть FileResult, а если файл недействителен или не существует, вы можете отобразить страницу PageNotFound.

Примечание. Если на клиенте не установлен Acrobat, вы не можете принудительно просматривать его в браузере.

public class ReportFile
{
    public byte[] Data { get; set; }
    public string FileName { get; set; }
    public string ContentType { get; set; }
}

public async Task<ActionResult> GenerateReport()
{
    //some code 
    var tempGuid = Guid.NewGuid().ToString();
    StaticData.ReportsTemp[tempGuid] = new ReportFile
    {
        Data = data, // Convert stream to byte array
        ContentType = obj.MediaType,
        FileName = obj.name
    };
    return Content(tempGuid);
}

public ActionResult DownloadReport(string fileName)
{
    if (StaticData.ReportsTemp.ContainsKey(fileName))
    {
        ReportFile file = StaticData.ReportsTemp[fileName];
        StaticData.ReportsTemp.Remove(fileName);

        if (file.ContentType == MediaTypeNames.Application.Pdf)
        {
            var cd = new ContentDisposition { FileName = file.FileName, Inline = true };
            Response.AppendHeader("Content-Disposition", cd.ToString());
            return File(file.Data, file.ContentType);
        }
    }
    return View("PageNotFound");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...