10

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

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

但这不会打开我的文件。我需要做什么?我需要在某处指定它是pdf?

4

5 回答 5

12

您将需要提供将接收文件名的操作的路径,解析完整路径,然后将磁盘上的文件从服务器流式传输到客户端。谢天谢地,网络上的客户端无法直接从服务器的文件系统中读取文件(除非......您是否建议远程用户@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>

请注意,某些浏览器可能具有不允许您打开本地文件的安全设置。

于 2012-06-19T12:34:37.060 回答
6

在您的视图中尝试这样

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

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

于 2013-04-16T10:18:53.677 回答
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();
}
于 2012-06-19T12:40:39.030 回答
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

这应该是使其工作的最简单方法。希望这可以帮助。

于 2018-04-09T18:40:03.317 回答
0

不幸的是,您无法指定打开 PDF 的位置,主要是因为您无法保证安装了 Adob​​e Acrobat 阅读器插件或其运行方式。

理论上你可以打开一个新窗口,并且在那个新窗口中有一个 JavaScript 函数来打开 PDF 文件,但同样你不能保证它会在没有插件的情况下在嵌入式窗口中打开,你能希望的最好的结果是“最好的尝试”。

于 2012-06-19T12:35:36.497 回答