2012-06-19 119 views
7

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

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

但是这不能打开我的文件。我需要做什么?我需要指定的地方,它是一个PDF?

回答

10

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

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

+0

我该在哪里解析路径以及如何流式传输?我现在得到的消息是Firefox不知道如何打开这个地址,因为协议(c)没有与任何程序关联。 – Tulips

+0

是的,@ Model.CertificatePath是实际的路径并且是正确的位置。那么,我以为我可以打开它? – Tulips

+0

当我输入你建议的内容时,它在路径中显示无效字符 – Tulips

0

不幸的是,您不能指定将在哪里打开PDF,主要是因为您无法保证安装Adobe Acrobat reader插件或它的功能。

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

+0

是的..我知道PDF插件在那里。所以我会尽我所能。我怎样才能做到这一点?我的浏览器说 – Tulips

+0

Firefox不知道如何打开这个地址,因为协议(c)没有与任何程序关联。 – Tulips

0

你可以让链接触发一个方法,如下面的方法,然后将你选择的文件流式传输到文件下载,而不是在浏览器中打开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(); 
} 
5

尝试像这样在你的浏览

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

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