2

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

所以我想要一个链接,例如:

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

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

4

3 回答 3

4

如果您将“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();

另一种方法是包含一个链接按钮,其中包含上述代码。出于安全目的,请确保验证文件名,但分配它,以便用户无法访问任意文件。

于 2012-09-07T14:46:25.383 回答
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 来做同样的事情。您可以查看此答案以获取有关如何执行此操作的更多详细信息。创建 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并将其放入您的网站。

于 2012-09-07T14:50:57.777 回答
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 抽出宝贵时间提供帮助!

于 2012-09-07T20:59:21.733 回答