2012-02-01 57 views
5

我发布一个页面的URL eg mysite.com/disclaimer/someinfo 这个页面显示了一个协议,如果用户点击同意按钮,那么一个PDF文件会作为附件。Response.WriteFile&Response.Redirect

这样做的目的是用户可以共享此URL,但在链接之后的其他人也必须在下载文件之前阅读协议。实际文件没有URL,但在服务器的其他地方保存,因此下载文件的唯一方法是如果单击“[同意]”按钮。

但是我发现很困难的是,点击按钮并开始下载后,我希望页面“消失”。带按钮的页面保留在屏幕上。理想情况下,他们会被重定向回他们来自的页面。我渴望不需要JavaScript或Cookie。引荐者存储在初始页面加载到表单上的隐藏字段中。

我试过不同的方法,试图在头文件中写入307重定向,并向用户发出警告,告知用户他们的发布数据正在被重定向。我下面的代码只适用于支持元刷新的浏览器(例如Firefox; IE7不是Chrome/Safari)

我可以看到为什么这种方法无效的逻辑。对浏览器有一个响应,那就是文件的预期。发送文件然后将浏览器重定向到其他页面的正确方法是什么?感觉来自用户p.o.v.这个“接受”页面一旦点击了按钮就会消失。

我:

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (Request.UrlReferrer != null & Request.UrlReferrer.ToString() != "") 
     { 
      Uri referrer = Request.UrlReferrer; 
      if (!IsPostBack) 
      { hfReferrer.Value = Request.UrlReferrer.ToString(); } 
     } 
    } 

    protected void buttonAccept_Click(object sender, EventArgs e) 
    { 
     //stream file 
     Node nodeCurrent = Node.GetCurrent(); 
     string fileName = nodeCurrent.GetProperty("documentFile").Value.ToString(); 
     System.IO.FileInfo file = new System.IO.FileInfo(fileName); 
     if (file.Exists) //set appropriate headers 
     { 
      Response.Clear(); 

      if (hfReferrer.Value !="") 
      {Response.AddHeader("Refresh", string.Format("3; URL={0}", hfReferrer.Value));} 

      Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); 
      Response.AddHeader("Content-Length", file.Length.ToString()); 
      Response.ContentType = "application/pdf"; 

      // write file to browser 
      Response.WriteFile(file.FullName); 
      Response.End(); 
     } 

我不希望需要使用JavaScript /弹出窗口等 目前用户只是必须点击一个链接到另一个页面,但是这并未”我觉得很对。

理想情况下,我想遵循一个很好的标准。但我不确定去哪里看。

回答

2

我会建议尝试一个稍微不同的行为。在buttonAccept_Click事件处理程序上,将用户重定向到一个感谢页面。在这个感谢页面的Page_Load中有下载文件的代码。 这很容易实现,并为用户提供更好的体验。

+0

只要确保您验证引用者是该页面的表单页面,以便用户无法复制该URL并在每次页面加载时直接访问该文件。 – CoderMarkus 2012-08-17 15:05:34