62,046
社区成员
发帖
与我相关
我的任务
分享
//通过form.submit的方式实现导出execl的功能
function _exportExecl(params){
...//弹出正在导出对话框
var downloadHelper = $('<iframe style="display:none;" id="downloadHelper"></iframe>').appendTo('body')[0];
var doc = downloadHelper.contentWindow.document;
if (doc) {
doc.open();
doc.write('')//微软为doc.clear()有时会出bug
doc.writeln("<html><body><form id='downloadForm' name='downloadForm' method='post' action='" + params.url + "'>");
for (var key in params)
doc.writeln("<input type='hidden' name='" + key + "' value='" + params[key] + "'>");
doc.writeln('<\/form><\/body><\/html>');
doc.close();
var form = doc.forms[0];
if (form) {
form.submit(); //提交表单后如何得到完成事件?
}
}
}
public void ProcessDownloadRequest(HttpContext context, Dictionary<string, string> dic)
{
.....//通过NPOI生成EXECL
#region 下载文件
Stream iostream = exporter.SaveAsStream();
byte[] buffer = new byte[iostream.Length];
iostream.Position = 0;
iostream.Read(buffer, 0, buffer.Length);
iostream.Close();
var res = HttpContext.Current.Response;
res.ContentType = "application/octet-stream";
//通知浏览器下载文件而不是打开
res.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(Decode("exportname"), System.Text.Encoding.UTF8));
res.BinaryWrite(buffer);
res.Flush();
res.End();
#endregion
}
Response.Write("<script> document.getElementById('myscript').innerHTML =setTimeout('myAlert(\"" + messon
+ "\",function(){location.href=\"SubjectPlaceMent.aspx\";})',500); ;</script>");
<script type="text/javascript" id="myscript"></script>
将js代码加载到script标签中,延迟0.5秒加载(等html文档加载完成)后执行
if (form) {
form.submit();
var icount = setInterval(function(){
if(doc.readyState != 'loading'){ //循环判断iframe状态,如果加载完成则表示开始了下载,此时关闭提示窗口
$.hideWaitForm();
clearTimeout(icount);
}
}, 1000);
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Headers["Content-disposition"] = "attachment; filename=" + HttpUtility.UrlEncode("啦啦啦.txt");
Response.TransmitFile(MapPath("~/app_data/swf.txt"));
Response.End();
}
你可以看到,页面就可以下载“啦啦啦.txt”文件了。用不着另开一个窗口。如果要显示“正在下载.....”提示,那么找一个普通的we页面通用的loading....插件就行了。
如果你说“我就是非要让下载是另一个的页面”,那么你应该这样先创建一个专门用来下载的Download.ashx:
using System;
using System.Web;
public class TestDownload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Headers["Content-disposition"] = "attachment; filename=" + HttpUtility.UrlEncode("啦啦啦.txt");
context.Response.TransmitFile(context.Server.MapPath("~/app_data/swf.txt"));
}
public bool IsReusable
{
get
{
return false;
}
}
}
然后你的页面弹出这个下载页protected void Button1_Click(object sender, EventArgs e)
{
var sc = string.Format("var ww= window.open('{0}');", ResolveUrl("~/TestDownload.ashx"));
sc += "alert(ww.closed); setTimeout(function(){ alert(ww.closed);}, 1000);";
ClientScript.RegisterStartupScript(this.GetType(), "dw", sc, true);
}
如果你实际测试一下,你会看到新打开的下载页的时候,首先ww的closed属性是false,然后当下载开始之后,它的closed属性就迅速变为true了。
实际上 ww 的 Closing事件、Unload事件、Closed 事件也会触发。
实际的js代码中,你可以监听事件,或者监听这个属性变化,或者使用一个定时器来循环检测一下这个属性的变化。
如果一定要写 IFrame 代码,看看这样的例子:<body>
<form id="form1" runat="server">
.........这里有一个Button按钮
<iframe id="download" src="#" runat="server" style="display: none;"></iframe>
</form>
</body>
protected void Button1_Click(object sender, EventArgs e)
{
this.download.Attributes["src"] = ResolveUrl("~/TestDownload.ashx");
}
(注意iframe写在<form runat="server">内部)
并且 Download.ashx的内容是<%@ WebHandler Language="C#" Class="TestDownload" %>
using System;
using System.Web;
public class TestDownload : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.Headers["Content-disposition"] = "attachment; filename=" + HttpUtility.UrlEncode("啦啦啦.txt");
context.Response.TransmitFile(context.Server.MapPath("~/app_data/swf.txt"));
}
public bool IsReusable
{
get
{
return false;
}
}
}
然后页面下载按钮可以写protected void Button1_Click(object sender, EventArgs e)
{
this.download.Attributes["src"] = ResolveUrl("~/TestDownload.ashx");
var sc = "var dd= frames['download'].window.document; alert(dd.readyState); setTimeout(function(){ alert(dd.readyState);}, 1000); setTimeout(function(){ alert(dd.readyState);}, 10000);";
ClientScript.RegisterStartupScript(this.GetType(), "dw", sc, true);
}
如果你只是js,其实是一样的。看懂了上面的,就知道如何在javascript端获取下载结果了。