将文件下载到客户端 PC 并回发到页面
Download file to client PC and post back to page
我有一个网页,它返回一组结果,然后你可以以.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();
}
我遇到的问题是,由于 Response.End((,JavaScript 永远不会写回页面;
我已经用两个按钮完成了它,一个用于创建报告,另一个用于下载它,但我的公司希望它合二为一。
有什么建议吗?
给定生成报告所需的时间长度,您提出的方法包含许多固有风险,每个风险都会导致报告创建失败:
- 用户可能会意外关闭浏览器/选项卡;
- 浏览器/标签可能会崩溃;
- Web 服务器上可能会发生超时。
我会以不同的方式解决这个问题。首先,我会看看是否可以优化报告生成 - "30 分钟"立即敲响警钟。假设在某个时候涉及数据库,我至少会调查以下内容:
- 数据库索引是否正在使用或正确使用?
- 报告生成查询是否包含低效操作(例如 CURSOR(?
- 执行计划是否揭示了报告生成过程中的任何其他缺陷?
如果这不是一个选项(假设您出于任何原因无法修改数据库(,我仍然会考虑一种完全不同的方法来生成报告,即将报告创建逻辑从 Web 应用程序移动到控制台应用程序中。
为此,您需要定义:
- 将报表参数传递到报表生成应用的方法;
- 识别请求报告的用户的方法(理想情况下是登录凭据或 Windows 标识(;
- 一种在报告准备就绪时通知用户的方法(电子邮件、屏幕消息(;
- 服务器上保存和下载报告的目录;
- 用户可以从中下载报表的单独页面。
几个数据库表应该足以记录此信息。
相关文章:
- asp.net网站文件下载历史记录
- Firefox,如何提交表单触发文件下载,但停留在网页上
- Interent Explorer中的数据URI文件下载
- 将页面上的文本替换为 jQuery 并提示文件下载
- JavaScript文件下载
- 是否可以触发文件下载到用户的浏览器
- Javascript JSON 到 Excel 文件下载
- 使用Javascript将多个文件下载为zip文件或文件夹
- 巴比伦JS-场景从本地文件下载
- 文件下载html与错误处理FileNotFound
- 使用jQuery捕获站点范围内的文件下载
- 在WinJS中将文件下载到文件系统
- JQuery启动文件下载,然后运行一个函数
- 文件下载无法在firefox上运行
- 创建文件下载js
- 如何使用JQuery禁用pdf文件下载选项
- 使用JavaScript/Jquery创建文本文件下载/更新到本地客户端机器中的特定位置
- CollectionFS中是否存在用于文件下载的事件侦听器/回调
- 文件下载后,Document Ready无法工作
- 将文件下载到客户端 PC 并回发到页面