将文件写入响应后启用按钮

时间:2011-05-19 17:32:47

标签: c# asp.net

有许多类似的问题,但仍然没有明确的答案解决了在将一些流写入响应后采取某些行动的问题。

我有以下情况:

在按钮上单击我生成一些excel文件,我将写入响应,允许用户下载生成的文件。单击按钮后,我正在禁用它,以防止双击此按钮。在Page-Load事件处理程序中,我有以下代码:

 GenerateBTN.Attributes.Add("onclick", "this.disabled=true;" + ClientScript.GetPostBackEventReference(GenerateBTN, "").ToString());

在Page_Load事件处理程序之后,GenerateBTN_Click处理程序执行生成文件所需的代码,并在此方法结束时(处理程序)我响应使用以下代码编写生成的文件:

Response.Clear();
Response.ContentType = "application/octet-stream";                
Response.AddHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
Response.WriteFile(@"C:\Reports\" + filename);
Response.End();    

出现“另存为”对话框,用户可以下载生成的文件,但问题是禁用的GenerateBTN仍然处于禁用状态。如何启用它将编写生成的文件写入响应?我理解清除当前响应我无法继续初始响应,但是有什么方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

您可以在页面上放置IFrame并将其visiblity设置为隐藏。让您的按钮加载IFrame中的文件,并使用Javascript检测IFrame是否仍在加载。加载完成后,启用按钮。

目前无法提供代码示例,但如果您决定采用此路线并需要样本,请告知我将更新此答案。

编辑第二个回答

您要做的是创建一个像“Download.aspx”这样的文件,您将其作为查询字符串参数传递给文件名。这样,您可以让服务器从Web应用程序路径之外的位置获取文件,并调整标头以强制下载文件。

Download.aspx

  using System.IO;
    protected void Page_Load(object sender, EventArgs e)
    {
        string FileName = Server.UrlDecode(Request.Params["FileName"]);  //Example: "MyFile.txt"

        Response.AppendHeader("Content-Type", "application/force-download");
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + FileName);
        Response.WriteFile(@"C:\MyFolder\" + FileName);
    }

您可以通过调用“Download.aspx?FileName = MyFile.txt”之类的内容来加载页面

您需要添加检查以确保文件存在且querystring参数存在,但这应该强制下载并允许您从其他位置获取文件。当您使用ASPX页面来提供文件时,您还可以进行凭据检查以查看用户是否已登录到您的站点(如果您已经具有登录逻辑),或者如果要保留,则将下载记录到日志文件/数据库中追踪它。它使您可以更好地控制下载过程。

至于IFrame加载代码,我不是100%确定这对文件下载是如何工作的,但我最初的想法是这样的 - 查看源代码:http://sykari.net/stuff/iframe

答案 1 :(得分:0)

在UpdatePanel中包装按钮,然后只需在文件工作之前和之后切换其启用的属性。

答案 2 :(得分:0)

  

您可以在页面上放置IFrame   将它的可见性设置为隐藏。有   你的按钮加载文件   IFrame并使用Javascript来检测是否   IFrame仍在加载或不加载。   加载完成后,启用您的   按钮。

     

无法提供代码示例   那一刻,但如果你决定这样做   路线,需要一个样品,让我知道我   将更新此答案。

我决定使用你的建议..但我仍然对这个问题有一些疑问...... 是否可以在iframe中加载.txt文件? 是否可以加载一些未包含在Web应用程序文件夹中的文件?

在iframe中加载txt文件的问题是它不会触发另存为对话框,而不是在iframe中显示该文件内容。

要将文件加载到iframe中,我使用了以下代码:

HiddenFrame.Attributes["src"] = /GeneratedFiles/ + "test.zip";

你可以看到我必须使用相对路径,我的文件必须包含在web应用程序的虚拟文件夹中。

什么是最好的javascript(jquery)eventhandler(函数)来检测Iframe何时完成加载?我使用了jquery函数:

 $("#ctl00_ContentPlaceHolder1_HiddenFrame").ready(function () {

        if ($("#ctl00_ContentPlaceHolder1_HiddenFrame").attr('src') != '') {

            $('#ctl00_ContentPlaceHolder1_GenerateSapFilesBTN').removeAttr("disabled");
        }
    });

但是在实际出现“另存为”对话框之前似乎启用了按钮..是否可以使用此类型的eventHandler解决此问题,或者我是否必须使用其他功能...