隐藏在asp.net回发上加载图像以进行文件下载

时间:2011-11-17 10:08:16

标签: javascript asp.net html events dom

我的asp.net页面上有一个按钮,用于回发,创建Excel文件,清除响应流并写入文件。然后,用户可以在浏览器的标准对话框中打开或保存文件用户。

这很好用,我的代码基于此:

http://www.adventuresindevelopment.com/2009/05/27/how-to-export-data-to-excel-in-aspnet/

由于要创建的文件需要很长时间,我创建了一个加载面板,只是一个隐藏的DIV,并在单击该按钮时将其设置为可见。

但我的问题是如何在导出完成后隐藏此DIV?我找不到这样做的方法。我需要像文件完全转移到浏览器时触发的事件。

这可能吗?任何最感谢的帮助。

谢谢,

AJ

1 个答案:

答案 0 :(得分:1)

我做什么,长话短说:

  1. 当用户点击“下载”按钮时,使用AJAX来呼叫 异步处理页面。此页面将生成您的Excel 记录并将其存储在临时位置

  2. 完成AJAX请求后,隐藏“正在加载”面板,然后 将用户重定向到下载页面。理想情况下,您应该重定向 到打开文件的通用(.ashx)处理程序,设置一些标题, 将临时文件传输给用户,并删除该文件 之后。

  3. 现在更多细节:

    对于第一步,您应该有一些临时文件夹,您可以在其中拥有读写权限。使用系统临时文件夹很好,因此您可以使用Path.GetTempFileName。以下是您可以在ashx处理程序中编写的示例:

    public class Handler1 : IHttpHandler, IRequiresSessionState
    {
    
        public void ProcessRequest(HttpContext context)
        {
            string fName = Path.GetTempFileName();
    
            context.Response.ContentType = "text/plain";
    
            try
            {
                // Generate the Excel document
                GenerateExcelInFile(fName);
    
                // Store the file name in session for later use
                context.Session["ExcelGeneratorFileName"] = fName;
    
                // Send confirmation to the client
                context.Response.Write("ok");
            }
            catch (Exception e)
            {
                context.Response.Write("error");
                // TODO : Do some logging
            }
    
        }
    
        // SNIP : IsReusable
    }
    

    之后,使用您最喜欢的JS框架来请求该处理程序,并测试返回的字符串。如果它是“ok”,则调用第二部分处理程序:

    public class Handler2 : IHttpHandler, IRequiresSessionState
    {
    
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/excel";
    
            // Make sure the browser will show a "save as" dialog to the user
            context.Response.AddHeader("content-disposition", "attachment; filename=Export.pdf");
    
            string fName = context.Session["ExcelGeneratorFileName"] as String;
    
            if (fName != null && File.Exists(fName))
            {
                // Stream the excel file to the response
                context.Response.WriteFile(fName);
    
                // Remove the file
                File.Delete(fName);
            }
        }
    
        // SNIP : IsReusable
    }
    

    您只需使用window.location = url即可在javascript中调用此页面。内容处置标题将告诉浏览器不应显示此URL,仅下载该URL,因此您的用户应保留在下载页面上。