Asp.net 如何使PDF文件可下载,使其不';不要在新窗口打开

Asp.net 如何使PDF文件可下载,使其不';不要在新窗口打开,asp.net,pdf,download,Asp.net,Pdf,Download,我在堆栈上找到了一个链接,它解释了如何做到这一点,但它仅用PHP术语解释。我想在我的网站上有一个PDF文件的链接,这样它就会自动转到“另存为”屏幕,而不是以网页形式打开。这样,最终用户将能够更轻松地下载它,因为我的许多客户不知道如何在网页上执行文件/另存为 所以我想要一个链接,比如: <a href="brochure.pdf" target="_blank">Download Brochure</a> 然后它将直接进入“另存为”框,允许客户将PDF手册保存到他/她

我在堆栈上找到了一个链接,它解释了如何做到这一点,但它仅用PHP术语解释。我想在我的网站上有一个PDF文件的链接,这样它就会自动转到“另存为”屏幕,而不是以网页形式打开。这样,最终用户将能够更轻松地下载它,因为我的许多客户不知道如何在网页上执行文件/另存为

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

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

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

如果将“宣传册.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();

另一种方法是包含一个包含上述代码的链接按钮。出于安全目的,请确保以分配文件名的方式验证文件名,这样用户就不会访问任意文件。

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

因此,您的链接必须如下所示:

<a href="DownloadMgr.aspx?File=brochure.pdf" target="_blank">Download Brochure</a>
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"]));                
}
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
不过,更好的方法是创建一个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>

下载管理器
无效页面加载(对象发送方,事件参数e)
{
如果(!this.Page.IsPostBack)
{
if(Request.QueryString[“File”!=null)
{
if(Request.QueryString[“文件”]。包含(“pdf”))
Response.ContentType=“application/pdf”;//根据正在传输的文件的不同而有所不同
Response.AddHeader(“内容处置”、“附件;文件名=“+Request.QueryString[“File”]);
Response.WriteFile(Server.MapPath(Request.QueryString[“File”]);
}
}
}
VB.NET版本

下载管理器
子页_加载()
如果(不是Page.IsPostBack),则
如果(Request.QueryString(“文件”)不是空的,那么
如果(Request.QueryString(“文件”)包含(“pdf”),那么
Response.ContentType=“application/pdf””根据流式传输的文件而有所不同
如果结束
Response.AddHeader(“内容处置”、“附件;文件名=“+Request.QueryString”(“文件”))
Response.WriteFile(Server.MapPath(Request.QueryString(“文件”))
如果结束
如果结束
端接头

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

如果有人需要知道,我会结合Tom和Icarus的答案找到答案,以备将来参考。我只需要将一些C#转换成VB。无论如何,我的超链接是:

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

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

如果您删除了目标,并且在标题中包含
附件,那么你就有你想要的了。谢谢亚里士多德。。。。我摆脱了目标,这很有帮助。谢谢你花时间回复。嘿,谢谢你花时间回复,汤姆。我正在努力。你的答案似乎与伊卡洛斯的答案相似。作为一名非程序员,我创建了一个页面DownloadMgr.aspx,但是我不确定我将把你建议的代码放在哪里,因为我甚至不知道页面加载在哪里。再次感谢你花时间帮忙!您的aspx页面有一个支持的DownloadMgr.aspx.cs文件。这将有一个页面加载事件。上面的代码是C#。只要把上面的代码放进去就行了。嘿,汤姆。。。我的DownloadMGR.aspx.vb文件中的代码就是这样的:分部类产品\u DownloadMGR继承System.Web.UI.Page结束类,但您和Icarus肯定让我走上了正确的道路,我将通过反复试验来解决这个问题。非常感谢你抽出时间来帮助我,我会让它工作起来的。再次感谢!你好,伊卡洛斯。看来你和汤姆有着相似的想法,只是方式略有不同。我确实做了一个DownloadMgr.aspx页面,但作为一名非程序员,我有点困惑于将您提供的代码放在哪里,因为我不知道页面加载到哪里。非常感谢您花时间回复。我会继续努力!非常感谢伊卡洛斯。它告诉我,它与基类页面中的属性“form”冲突,应该在阴影中声明。ifs在VS 2010中加了下划线,表示它们不能出现在方法体/多行lambda之外,响应用弯曲的蓝色加了下划线,表示需要声明。但你肯定让我走上了正确的道路——我将通过尝试和错误来试探性地解决这个问题。非常感谢你抽出时间来帮助我。我会让它工作的@JasonWeber很抱歉,我发布的代码缺少一个
}
,导致了一些错误。我再次更新了代码。复制并再次粘贴它。嘿@Icarus——我试图通过Telerik的代码转换器运行修改后的代码,因为我的站点是vb,它给了我这个错误:转换错误:代码无法转换。详细信息:-第2行第4列:“}”应为“请检查原始代码中是否有任何错误,然后重试。
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