Response.WriteFile & Response.Redirect

5

我需要发布一个页面URL,例如mysite.com/disclaimer/someinfo。这个页面展示的是一个协议,如果用户点击同意按钮,则会将PDF文件作为附件流式传输。

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

然而,我发现困难的是,在单击按钮并开始下载后,我希望页面可以“消失”。按钮所在的页面仍会停留在屏幕上。理想情况下,它们将被重定向回来自的页面。我不想要求使用JavaScript或cookie。推荐人存储在初始页面加载到表单的隐藏字段中。

我尝试了不同的方法,尝试在头部编写307重定向,但会导致用户看到警告,提示他们的Post数据正在被重定向。我下面的代码只适用于支持元刷新的浏览器(例如Firefox;IE7不支持Chrome/Safari)

我能够理解为什么这不起作用。浏览器只有一个响应,那就是预期的文件。发送文件后,将浏览器重定向到另一个页面的正确方法是什么?从用户的角度来看,一旦他们点击了按钮,这个“接受”页面应该消失。

我已经尝试过:

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 /弹出窗口等技术。

当前,用户只需单击链接即可转到另一个页面,但这不是很好的体验。

理想情况下,我想遵循一个良好的标准。但我不确定在哪里寻找。

1个回答

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

请确保您验证了引用该页面的来源是表单页面,这样用户就无法复制该URL并在每个页面加载时直接访问文件。 - CoderMarkus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接