首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在通过Response.ContentType、Response.End输出文件时显示进度状态/旋转器?

如何在通过Response.ContentType、Response.End输出文件时显示进度状态/旋转器?
EN

Stack Overflow用户
提问于 2014-01-14 19:03:26
回答 2查看 3.1K关注 0票数 4

我有一个带有下载LinkButton的webform,在按钮的单击事件上,我获取数据,然后生成一个.XLSX文件供下载。在文件生成过程中,调用Response.Clear(),设置Response.ContentType,最后调用Response.End()

在该操作期间,我需要显示一个旋转器.gif。一旦生成了文件并弹出文件"Open/Save“对话框,旋转器就不应该显示。不幸的是,由于我正在更改内容类型并调用Response.End,因此没有返回到页面的响应。

谁能为这个场景提供一点帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-25 18:35:18

实际上,我最终提出了一个不需要使用iFrame的解决方案。相反,我使用了一个Cookie,它的文件生成过程将一个简单的名称值对写入其中。随后,可以通过JavaScript从客户端检查此cookie,以确定响应(.xlsx文件)何时完成。

结果应该是加载旋转图像应该显示,直到生成了DownloadComplete=true文件并将返回给客户端(Cookie包含.xls名称值对)。

  1. OnClientClick事件中,LinkButton: 函数startFileDownload(){ // Set Timout用于再次调用checkState函数setTimeout(checkState,1100);setCookie('DownloadComplete','',1);//下载正在启动,隐藏下载LinkButton document.getElementById('<%= btnDownloadExcel.ClientID%>').style.display = "none";//显示进度旋转变量img = document.getElementById("image1");img.src =“Image/99.GIF”;document.getElementById('image1').className = "spinnerDisplay";}
  2. 下面是checkState函数的checkState代码: 函数checkState() { var img = document.getElementById("image1");var finished = getCookie("DownloadComplete");//检查下载是否完成if (!isEmpty(已完成)){ setCookie('DownloadComplete','');// DownloadComplete;//DownloadComplete;}{ //刷新进度旋转器,将Timout设置为再次调用checkState函数img.src =“Image/99.GIF”;setTimeout(checkState,1100);}
  3. 下面是JavaScript代码,用于setCookiegetCookie函数: 函数setCookie( cName,value){ var now =新日期();var time = now.getTime();time += 3600 * 1000;now.setTime(time);document.cookie =cName+ "=“+ value + ';expires=‘+ now.toGMTString() + ';path=/';}函数getCookie(cName) { var i,x,y,ARRcookies = document.cookie.split(";");for (i = 0;i< ARRcookies.length;( i++) {x= ARRcookiesi.substr(0,ARRcookiesi.indexOf("="));y= ARRcookiesi.substr(ARRcookiesi.indexOf("=") + 1);x=x.replace(/^s+x\s+$/g,"");if (x == cName) {返回unescape(y);}}
  4. 然后,在生成.xlsx文件的类的服务器端,清除HTTP 之后,向Cookie添加一个名称值对: HttpContext.Current.Response.AppendCookie(cookie);();//追加一个cookie,该cookie将告诉浏览器文件已完成处理//并包含在该流中(注意到特定路径必须匹配JavaScript中设置的cookie路径) HttpCookie cookie=新HttpCookie("DownloadComplete","true");cookie.Expires = DateTime.Now.AddMinutes(60);cookie.Path = "/";//这里指定MIME类型的//其他代码,设置header //并Response.BinaryWrite输出文件HttpContext.Current.Response.End();
票数 4
EN

Stack Overflow用户

发布于 2014-01-16 14:16:06

它应该是这样的:(解决方案之一)

1)在您的页面上创建一个iframe,它将实际下载您的文件(因此您的主页不会为空白)。

2)在响应中添加cookie。通过

Response.AddHeader("content-disposition", "attachment;filename=1.jpg");

3)当用户按下“下载”键时,设置(通过js) src,让iframe下载该文件。你还展示了旋转器。在此之后,如果有cookie,就开始通过setInterval阅读。如果有-下载已经完成,所以您可以隐藏旋转器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21121808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档