我有一个 MVC 应用程序。当用户单击页面上的打开按钮时,我需要打开 pdf 文件。存储 pdf 的文件路径是从数据库中读取的,它是 c: 上的文件。如何在我的 html 代码中打开它?我有这个代码:
<a href="@Model.CertificatePath" target="_blank" class="button3">Open</a>
但这不会打开我的文件。我需要做什么?我需要在某处指定它是pdf?
我有一个 MVC 应用程序。当用户单击页面上的打开按钮时,我需要打开 pdf 文件。存储 pdf 的文件路径是从数据库中读取的,它是 c: 上的文件。如何在我的 html 代码中打开它?我有这个代码:
<a href="@Model.CertificatePath" target="_blank" class="button3">Open</a>
但这不会打开我的文件。我需要做什么?我需要在某处指定它是pdf?
您将需要提供将接收文件名的操作的路径,解析完整路径,然后将磁盘上的文件从服务器流式传输到客户端。谢天谢地,网络上的客户端无法直接从服务器的文件系统中读取文件(除非......您是否建议远程用户@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>
请注意,某些浏览器可能具有不允许您打开本地文件的安全设置。
在您的视图中尝试这样
@Html.ActionLink("View", "ViewPDF", new { target = "_blank" })
现在链接将在新窗口中打开。您可以在 ViewPDF 控制器方法中写入 pdf 字节
您可以让链接触发一种方法,例如下面的方法,然后将您选择的文件流式传输到文件下载,而不是在浏览器中打开 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();
}
好吧,如果您获得路径值并且该值在 @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
这应该是使其工作的最简单方法。希望这可以帮助。
不幸的是,您无法指定打开 PDF 的位置,主要是因为您无法保证安装了 Adobe Acrobat 阅读器插件或其运行方式。
理论上你可以打开一个新窗口,并且在那个新窗口中有一个 JavaScript 函数来打开 PDF 文件,但同样你不能保证它会在没有插件的情况下在嵌入式窗口中打开,你能希望的最好的结果是“最好的尝试”。