【问题标题】:Open PDF in a new tab in browser在浏览器的新选项卡中打开 PDF
【发布时间】:2016-09-24 16:15:51
【问题描述】:

以前从未这样做过,所以不确定其中涉及到什么。我确实搜索并找到了很多答案,但它们比我需要的更复杂。例如,他们需要放大、生成、创建准确的缩略图、在网页中嵌入实际的 PDF 等等……但我的问题要简单得多: 如果我在网页上显示他的信息的我的人有一些 PDF 要显示我只想在页面上放置一个通用 PDF 图标,人们点击它,实际的 PDF 在浏览器的新选项卡中打开。

这样做涉及什么? 它不像文件路径,PDF 以二进制对象的形式保存在 SQL Server 中,或者将其保存在 SQL Server 中的任何操作..它不是服务器上的文件磁盘路径

【问题讨论】:

  • PDF 是嵌入的还是从服务器下载的?您当前形式的问题过于宽泛,无法得到好的答案。
  • @Nkosi 我从服务器查询了这个人的数据,如姓名、姓氏等。那里还有一个图像表,而不是 JPEG、PDF 等。链接到这个家伙的主键,所以我查询。
  • 查看@Fran 的回答
  • @Bohn:这并不是互联网的真正运作方式。 Web 服务器只返回一个响应,该响应由标头(其中包括告诉客户端或浏览器响应主体的 mime 类型)和响应主体本身(此处为原始 PDF 数据)组成。从某种意义上说,它自然会流式传输,因为 TCP/IP 是基于数据包的,因此 PDF 数据以块的形式出现,客户端将其缝合在一起。但是,一旦它到达客户端的机器,您就无法再控制任何东西了。从技术上讲,一旦开始返回响应,您就不再拥有控制权。
  • 链接本身的目标属性是提示浏览器打开一个新标签的。

标签: asp.net-mvc asp.net-mvc-5


【解决方案1】:

您的标签表示 asp.net-mvc。

创建一个控制器来处理对 PDF 文件的请求

伪:

[RoutePrefix("Pdf")]
public class PdfController : Controller {
    [Route("{id}"]
    public ActionResult GetPDF(int id) {    
        //...Code to extract pdf from SQLServer and store in stream
        Stream stream = GetDataFromSQLServerById(id);
        return File(stream,"filename.pdf");
    }
}

在客户端

<a href="/Pdf/123456" target="_blank">
    <img src="images/pdficon.jpg">
</a>

更新:

引用@ChrisPratt 的评论; (我忘了包括在我的答案中)

锚标记上的target 属性会告诉浏览器在新标签页中打开链接。

【讨论】:

  • 谢谢,给了我大致的思路。但是什么是 RoutePrefix("Pdf")] 和 [Route("{id}"] 我需要它们吗?我还需要像你这里那样的新控制器吗?或者我几乎可以在我的模型中使用 GetDataFromSQLServerById ?
  • 我使用的是属性路由。我只是展示一个例子。您可以将该操作添加到您自己选择的控制器中。
  • 那是属性路由。除非您使用属性路由,否则您不需要它们。否则,只需将它们设为您想要的 URL。
  • 我在我的项目中使用了这个解决方案,它运行良好,只有我的视觉工作室现在告诉我目标属性只允许使用 href,我目前正在使用 asp-action。关于是否应该更改代码或忽略警告的任何想法?
  • @RobRombouts 好的,基于此,我可以说您可以忽略该警告。渲染后,该标签将具有 href。
【解决方案2】:

为您的链接创建一个控制器操作

public PdfResult GetPdf(int databaseRecordId)
{
    var dbRecord = your code to return the sql record.

    return new PdfResult(dbRecord.PdfBytes, "whatever name you want to show.pdf");

}

public class PdfResult : FileResult
{
    private const String DefaultFileName = "file.pdf";
    private readonly Byte[] _byteArray;

    public PdfResult(Byte[] byteArray, String fileName = DefaultFileName)
        : base(MediaTypeNames.Application.Pdf)
    {
        _byteArray = byteArray;
        FileDownloadName = fileName;
    }
    protected override void WriteFile(HttpResponseBase response) { response.BinaryWrite(_byteArray); }
}

查看代码

<a href="<controller/action/databaseRecordId>" target="_blank">
<img src="<image-path>">
</a>

【讨论】:

  • 是的。我不想删除那个,因为问题从如何在新选项卡中打开 pdf 到将 pdf 字节数组从数据库打开到新选项卡
猜你喜欢
  • 2014-03-19
  • 2015-06-11
  • 2016-05-04
  • 2021-03-25
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多