如何使PDF可下载,以便它不会在新窗口中打开

时间:2012-09-07 14:26:35

标签: asp.net pdf download

我在Stack上找到了一个解释如何执行此操作的链接,但它仅在PHP术语中解释了它。我想在我的网站上将链接转换为PDF文件,以便它自动进入“另存为”屏幕而不是以网页形式打开。这样,最终用户将能够更轻松地下载它,因为我的很多客户都不知道如何在网页上执行文件/保存。

所以我希望有一个链接,例如:

<a href="brochure.pdf" target="_blank">Download Brochure</a>

然后它将直接进入“另存为”框并允许客户将PDF手册保存到他/她的计算机而无需打开另一个网页。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

如果您将“brochure.pdf”替换为在Page_Load事件中包含以下代码的asp.net页面,您将获得所需的行为:

  string filename = "brochure.pdf";
  Response.ContentType = "image/pdf";
  string headerValue = string.Format("attachment; filename={0}", filename);
  Response.AppendHeader("Content-Disposition", headerValue);
  Response.TransmitFile(Server.MapPath(filename));
  Response.End();

另一种方法是包含一个包含上述代码的链接按钮。出于安全考虑,请确保验证文件名,但是您指定了文件名,以便用户无法访问任意文件。

答案 1 :(得分:2)

除非您将Content-Disposition标头添加到响应中,否则不能单独强制从超链接下载文件(或使用Javascript可靠地下载);因此,解决此问题并始终强制下载文件的一种方法可能是拥有一个中间页面,为您添加标题。

因此,您的链接必须是这样的:

<a href="DownloadMgr.aspx?File=brochure.pdf" target="_blank">Download Brochure</a>

DownloadMgr.aspx应该是这样的:

if(!IsPostback)
{
    if(Request.QueryString["File"]!=null) 
    {  
       if(Request.QueryString["File"].Contains("pdf")))
          Response.ContentType = "application/pdf"; //varies depending on the file being streamed
   Response.AddHeader("Content-Disposition", "attachment; filename=" +  Request.QueryString["File"]);
   Response.WriteFile(Server.MapPath(Request.QueryString["File"]));                
}

更好的方法是创建一个HTTPHandler来做同样的事情。您可以查看this answer以获取有关如何执行此操作的更多详细信息。创建HTTPHandler的一个好处是它不涉及常规aspx页面所需的所有处理,初始化等。

完整代码示例:

<%@ Language=C# %>
<HTML>
<head>
    <title>Download Manager</title>
</head>
   <script runat="server" language="C#">
       void Page_Load(object sender, EventArgs e)
       {
           if (!this.Page.IsPostBack)
           {
               if (Request.QueryString["File"] != null)
               {
                   if (Request.QueryString["File"].Contains("pdf"))
                       Response.ContentType = "application/pdf"; //varies depending on the file being streamed
                   Response.AddHeader("Content-Disposition", "attachment; filename=" + Request.QueryString["File"]);
                   Response.WriteFile(Server.MapPath(Request.QueryString["File"]));
               }
           }
       }
   </script>
   <body>
      <form id="form" runat="server">

      </form>
   </body>
</HTML>

VB.NET版本

<%@ Language="VB" %>
<HTML>
<head>
    <title>Download Manager</title>
</head>
   <script runat="server" language="VB">
       Sub Page_Load()
           If (Not Page.IsPostBack) Then

               If (Request.QueryString("File") IsNot Nothing) Then
                   If (Request.QueryString("File").Contains("pdf")) Then
                       Response.ContentType = "application/pdf" 'varies depending on the file being streamed
                   End If
                   Response.AddHeader("Content-Disposition", "attachment; filename=" + Request.QueryString("File"))
                   Response.WriteFile(Server.MapPath(Request.QueryString("File")))
               End If
           End If
       End Sub
   </script>
   <body>
      <form id="form" runat="server">

      </form>
   </body>
</HTML>

现在将上述代码保存为DownloadMgr.aspx并将其放入您的网站。

答案 2 :(得分:0)

如果有人需要知道,为了将来的参考,我找到了汤姆和伊卡洛斯的答案相结合的答案。我只需将一些C#转换为VB。无论如何,我的超链接是:

<a href="DownloadMgr.aspx">Download Brochure</a>

我的DownloadMgr.aspx.vb代码背后是这样的:

Partial Class products_DownloadMgr
    Inherits System.Web.UI.Page

 Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

    Dim filename As String = "USS_Exact_Scan_Introduction.pdf"
    Response.ContentType = "image/pdf"
    Dim headerValue As String = String.Format("attachment; filename={0}", filename)
    Response.AppendHeader("Content-Disposition", headerValue)
    Response.TransmitFile(Server.MapPath(filename))
    Response.[End]()

End Sub

End Class

非常感谢Tom和Iracus花时间提供帮助!