我有一个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文件吗?
您需要提供一个路径,指向一个接收文件名的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>
请注意,某些浏览器可能有安全设置,禁止您打开本地文件。
@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 Reader插件或其功能如何。
理论上,您可以打开一个新窗口,并在该新窗口中使用JavaScript函数打开PDF文件,但同样无法保证它会在没有插件的嵌入式窗口中打开,您能做到的最好只是“尽力而为”。
CertificatePath
的值是什么? - moribvndvs