ASP.NET MVC 如何在新窗口中打开 PDF 文件

11

我有一个MVC应用程序。当用户在页面上点击打开按钮时,我需要打开pdf文件。pdf文件的路径从数据库中读取,它是在C:盘上的文件。我该如何在我的html代码中打开它?我有以下代码:

<a href="@Model.CertificatePath" target="_blank" class="button3">Open</a>

但是这并没有打开我的文件。我需要做些什么?我需要在某个地方指定它是一个pdf文件吗?

5个回答

13

您需要提供一个路径,指向一个接收文件名的Action,该Action将解析完整路径,然后从服务器上将磁盘上的文件流式传输到客户端。网上的客户端无法直接从您的服务器文件系统中读取文件(除非...您是在暗示@Model.CertificatePath是远程用户机器上的文件路径吗?)。

public ActionResult Download(string fileName)
{
   string path = Path.Combine(@"C:\path\to\files", fileName);

   return File(path, "application/pdf");

}

更新

如果@Model.CertificatePath是客户端实际机器上的位置,请尝试:

 <a href="file://@Model.CertificatePath" target="_blank" class="button3">Open</a>
请注意,某些浏览器可能有安全设置,禁止您打开本地文件。

我应该在哪里解析路径以及如何进行流处理?我现在收到的消息是Firefox不知道如何打开此地址,因为协议(c)没有与任何程序相关联。 - Tulips
是的,@Model.CertificatePath 是实际路径,也是正确的位置。所以,我想我可以直接打开它吗? - Tulips
当我输入你建议的内容时,它显示路径中有无效字符。 - Tulips
<a href="file://@Model.CertificatePath" target="_blank" class="button3">打开</a> - Tulips
CertificatePath 的值是什么? - moribvndvs
所以我所做的就是使用FileSystem打开文件。点击事件会带我进入一个函数,该函数会在Adobe中打开文件。 - Tulips

6
在您的视图中尝试像这样使用:

@Html.ActionLink("View", "ViewPDF", new { target = "_blank" })

现在链接将在新窗口中打开。您可以在ViewPDF控制器方法中编写pdf字节。


1

您可以让链接触发以下方法,然后将您选择的文件流式传输到文件下载,而不是在浏览器中打开PDF。

/// <summary>
/// Forces a file to be displayed to the user for download.
/// </summary>
/// <param name="virtualPath"></param>
/// <param name="fileName"></param>
public static void ForceDownload(string virtualPath, string fileName)
{
    HttpResponse response = HttpContext.Current.Response;
    response.Clear();
    response.AddHeader("content-disposition", "attachment; filename=" + fileName);
    response.WriteFile(virtualPath);
    response.ContentType = "";
    response.End();
}

1

如果您获取路径值并且该值在@Model.CertificatePath中,那么这将不起作用。

需要进行修改。

<a href="@Model.CertificatePath" target="_blank" class="button3">Open</a>

你需要添加这个。
<a href="@Url.Content(Model.CertificatePath)" target="_blank" class="button3">Open</a>

请确保您的路径是相对路径,通过添加波浪线(~)来实现。例如,如果您的路径为/Content/pdfs/CertificatePath.pdf

它需要看起来像这样:

~/Content/pdfs/CertificatePath.pdf

这应该是实现的最简单方法。 希望能有所帮助。

0

不幸的是,您无法决定PDF文件将在哪里打开,主要是因为您无法保证已安装Adobe Acrobat Reader插件或其功能如何。

理论上,您可以打开一个新窗口,并在该新窗口中使用JavaScript函数打开PDF文件,但同样无法保证它会在没有插件的嵌入式窗口中打开,您能做到的最好只是“尽力而为”。


是的,我知道PDF插件已经存在。所以我会尽力而为。我该怎么做呢?我的浏览器显示 - Tulips
Firefox不知道如何打开此地址,因为协议(c)未与任何程序关联。 - Tulips

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接