【问题标题】:How can I open a pdf file directly in my browser?如何在浏览器中直接打开 pdf 文件?
【发布时间】:2019-01-04 19:50:24
【问题描述】:

我想直接在浏览器中查看PDF 文件。我知道已经有人问过这个问题,但我还没有找到适合我的解决方案。

到目前为止,这是我的操作的控制器代码:

public ActionResult GetPdf(string fileName)
{
    string filePath = "~/Content/files/" + fileName;
    return File(filePath, "application/pdf", fileName);
}

这是我的看法:

@{
   doc = "Mode_d'emploi.pdf";
} 

<p>@Html.ActionLink(UserResource.DocumentationLink, "GetPdf", "General", new { fileName = doc }, null)</p>

当我将鼠标悬停时,这里的链接就是链接:

我的代码的问题是 pdf 文件没有在浏览器中查看,但我收到一条消息,询问我是否要打开或保存文件。

我知道这是可能的并且我的浏览器支持它,因为我已经在另一个网站上对其进行了测试,允许我直接在浏览器中查看pdf

例如,当我将鼠标悬停在链接上时(在另一个网站上),这是链接:

如您所见,生成的链接有所不同。不知道有没有用。

知道如何在浏览器中直接查看我的pdf 吗?

【问题讨论】:

标签: c# asp.net-mvc


【解决方案1】:

您收到要求您打开或保存文件的消息的原因是您指定了文件名。如果您不指定文件名,PDF 文件将在您的浏览器中打开。

所以,您需要做的就是将您的操作更改为:

public ActionResult GetPdf(string fileName)
{
    string filePath = "~/Content/files/" + fileName;
    return File(filePath, "application/pdf");
}

或者,如果您需要指定文件名,您必须这样做:

public ActionResult GetPdf(string fileName)
{
    string filePath = "~/Content/files/" + fileName;
    Response.AddHeader("Content-Disposition", "inline; filename=" + fileName);        

    return File(filePath, "application/pdf");
}

【讨论】:

  • 完美!它帮助我改进了我们公司的文档管理系统项目!
【解决方案2】:

不要返回File,而是尝试返回FileStreamResult

public ActionResult GetPdf(string fileName)
{
    var fileStream = new FileStream("~/Content/files/" + fileName, 
                                     FileMode.Open,
                                     FileAccess.Read
                                   );
    var fsResult = new FileStreamResult(fileStream, "application/pdf");
    return fsResult;
}

【讨论】:

  • @ataravati 返回流结果时这是正确的。如果您要返回文件,您的答案将起作用
  • @TBAG,在我的回答中,我已经解释了为什么这不是正确的答案。因为它没有告诉您为什么会收到要求您打开或保存的消息。
【解决方案3】:

将您的代码更改为:

       Response.AppendHeader("Content-Disposition","inline;filename=xxxx.pdf");
       return File(filePath, "application/pdf");

【讨论】:

  • 此解决方案允许在用户想要保存文件名时保留文件名。谢谢。
【解决方案4】:

如果你读取存储在数据库图像列中的文件,你可以这样使用:

public ActionResult DownloadFile(int id)
{
    using (var db = new DbContext())
    {
        var data =
            db.Documents.FirstOrDefault(m => m.ID == id);
        if (data == null) return HttpNotFound();
        Response.AppendHeader("content-disposition", "inline; filename=filename.pdf");
        return new FileStreamResult(new MemoryStream(data.Fisier.ToArray()), "application/pdf");
    }
}

【讨论】:

    【解决方案5】:

    如果你使用 Rotativa 包来生成 PDF,那么不要像下面的例子那样为具有 FileName 属性的文件命名。

     return new PartialViewAsPdf("_JcPdfGenerator", pdfModel);
    

    希望这对某人有所帮助。

    【讨论】:

      【解决方案6】:

      虽然以前的帖子通常是正确的;我认为他们中的大多数都不是最佳实践! 我想建议将动作返回类型更改为FileContentResult,并在动作主体的末尾使用return new FileContentResult(fileContent, "application/pdf");

      【讨论】:

      • FileContentResult 在 MVC 和 MVC Core 中吗?
      • return File(fileContent, "application/pdf") 将返回一个 FileContentResult -- 至少在 .net 核心中
      【解决方案7】:

      是的,你可以通过重定向来做到这一点。它像你需要的那样结束扩展,.pdf ..

      protected void OpenPdfPdf_Click(object sender, EventArgs e)
              {
                  Response.Redirect("jun.pdf");
              }
      

      或其他方法,其打开方式类似于 .aspx 页面--

       protected void OpenPdf_Click(object sender, EventArgs e)
              {
                  string path = Server.MapPath("jun.pdf");
                  //or you want to load from url change path to
      //string path="https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf";   
                  WebClient client = new WebClient();
                  Byte[] buffer = client.DownloadData(path);
                  if (buffer != null)
                  {
                      Response.ContentType = "application/pdf";
                      Response.AddHeader("content-length", buffer.Length.ToString());
                      Response.BinaryWrite(buffer);
                  }
              }
      

      【讨论】:

        猜你喜欢
        • 2021-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多