【问题标题】:Download file to client PC and post back to page将文件下载到客户端 PC 并返回页面
【发布时间】:2013-09-27 09:15:53
【问题描述】:

我有一个网页,它返回一组结果,然后您可以以 .csv 格式请求这些结果。

由于文件的创建时间很长(有时长达 30 分钟),我添加了一些 JavaScript,将类添加到 div 以便它覆盖屏幕,以告诉用户正在创建报告,并且要有耐心。

创建并下载文件后,我希望 div 恢复到不存在的原始状态(可以这么说)。

这是我目前拥有的。

JavaScript

function skm_LockScreen() {
    var lock = document.getElementById('ctl00_ContentPlaceHolder1_skm_LockPane');
    var lock2 = document.getElementById('ctl00_ContentPlaceHolder1_pleaseWait');
    if (lock)
        lock.className = 'LockOn';
    if (lock2)
        lock2.className = 'WaitingOn';
}
function skm_UnLockScreen() {
    var lock = document.getElementById('ctl00_ContentPlaceHolder1_skm_LockPane');
    var lock2 = document.getElementById('ctl00_ContentPlaceHolder1_pleaseWait');
    if (lock)
        lock.className = 'LockOff';
    if (lock2)
        lock2.className = 'WaitingOff';
}

按钮

<asp:Button ID="LatestReportButton" runat="server" CssClass="standardButton" Text="Latest Quote Report" Width="140px"
OnClick="ReportButton_Click" CommandArgument="2" OnClientClick="skm_LockScreen()" />

后面的代码

protected void ReportButton_Click(object sender, EventArgs e)
    {
        Page.ClientScript.RegisterStartupScript(base.GetType(), "unlock", "<script type=\"text/javascript\">skm_UnLockScreen();</script>");
        try
        {
            //Start creating the file
            using (StreamWriter sw = new StreamWriter(tempDest + "\\" + csvGuid + ".csv", true))
            {
                //Code to create the file goes 
            }
        }
        catch
        {
        }
        Response.AddHeader("Content-disposition", "attachment; filename=report.csv");
        Response.ContentType = "application/octet-stream";
        Response.WriteFile("CreatedReport.csv");
        Response.End();
    }

我遇到的问题是 JavaScript 永远不会因为 Response.End(); 而写回页面

我已经将它作为两个按钮完成,一个用于创建报告,另一个用于下载,但我的公司更希望它合二为一。

有什么建议吗?

【问题讨论】:

    标签: c# javascript asp.net download response


    【解决方案1】:

    鉴于生成报告所需的时间长度,您提议的方法包含许多固有风险,每一个都会导致报告创建失败:

    • 用户可能不小心关闭了浏览器/选项卡;
    • 浏览器/标签页可能会崩溃;
    • Web 服务器上可能会发生超时。

    我会以不同的方式解决这个问题。首先,我会看看是否可以优化报告生成——“30 分钟”会立即敲响警钟。假设在某些时候涉及数据库,我将至少调查以下内容:

    • 是否正在使用或正确使用数据库索引?
    • 报告生成查询是否包含低效操作(例如 CURSOR)?
    • 执行计划是否揭示了报告生成过程中的任何其他缺陷?

    如果这不是一个选项(假设您不能出于任何原因修改数据库),我仍然会考虑一种完全不同的方法来生成报告,从而将报告创建逻辑移到 Web 应用程序之外比如说,一个控制台应用程序。

    为此,您需要定义:

    • 一种将报告参数传递给报告生成应用程序的方法;
    • 一种识别请求报告的用户的方法(最好是登录凭据或 Windows 身份);
    • 一种在报告准备就绪时通知用户的方式(电子邮件、屏幕消息);
    • 服务器上用于保存和下载报告的目录;
    • 用户可以从中下载报告的单独页面。

    几个数据库表应该足以记录这些信息。

    【讨论】:

    • 谢谢罗伯。我最终在一个新窗口中创建了报告,该窗口向用户指示正在创建报告并耐心等待。完成后,此窗口会下载文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    相关资源
    最近更新 更多