javascript - MVC 5如何强制浏览器打开PDF文件

标签 javascript c# asp.net-mvc asp.net-mvc-5

我花了一整天的时间试图强制浏览器打开 PDF 文件,而不是使用 System.Web.Mvc.FileResult 下载它,并且我以旧时尚的方式 System.Web 做到了这一点.响应如下:

Controller

 //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 收到的字典键我正在调用操作 下载从 StaticData.Reports 字典返回 FileStremResult

PDF 在浏览器中打开,所有其他文件仍然只是下载。

但是我仍然想知道是否还有其他方法可以实现这一目标? 有没有办法用 System.Web.Mvc ActionResult 的类来做到这一点?

最佳答案

我不知道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");
}

关于javascript - MVC 5如何强制浏览器打开PDF文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50515431/

相关文章:

c# - 使用一个委托(delegate)引用多个方法

c# - ASP.NET MVC 在 ViewModel 中包含 List 属性的回发列表后为空

asp.net-mvc - 如何根据 Asp.Net MVC 中的 View 设置 <body> 类?

javascript - 如何在 chrome 中使用 jquery.load() 在 html 中嵌入文件

javascript - 允许 Angular Controller 或 View 中使用 html 标签

javascript - 只打印<div>内容的特定部分

javascript - 为什么我的复选框不可见?

c# - 对 cybersource 的无效交易尝试给出错误

c# - 如何制作点击透视 'always on top'窗口

c# - 如何使 Entity Framework 异步执行