我最近在工作中遇到问题。导出和添加进度条本来可以说是一件很简单的事情,但是必须出现文件下载的弹出框,也就是说,它是完全同步的。有很多方法可以找出以下方法是否有效。
干货分析
js代码`
导出请求方法ExportDownloadTimer是前端和后端的对象,用于监视导出是否完成
var params = {};//参数需要往后台传递的参数信息
$.ajax({
type: "POST",
url: url,//导出的触发文件路径
data: params,//绑定参数
success: function (response, status, request) {
params.DownParams = DownParams;//下载的参数在这个参数主要在后端中记录cookie信息
var disp = request.getResponseHeader(Content-Disposition);
if (disp && disp.search(attachment) != -1) { //判断是否为文件
var form = $(js代码

ExportDownloadTimer方法
Count和MaxCount用于解决无限循环,这可能会限制整个过程等待的最大值。
var ExportDownloadTimer = {
Cache: null,//记录缓存方式
Count: 0,//走到的位置 当前允许的次数
MaxCount: 0,//最大执行次数
KeyId: "",//的名称
KeyValue: "",//对比值
CheckToken: function () {
//前端实时监测时间戳和后台设置的cookie值是否相等,相等就说明文件下载成功,就可以关闭提示框
var token = ExportDownloadTimer.GetCookie(ExportDownloadTimer.KeyId);
ExportDownloadTimer.Count++;
if ((token && token == ExportDownloadTimer.KeyValue) ||
ExportDownloadTimer.MaxCount < ExportDownloadTimer.Count) {
clearTimeout(ExportDownloadTimer.Cache);
ExportDownloadTimer.Cache = null,
ExportDownloadTimer.Count = 0;
ExportDownloadTimer.MaxCount = 0;
ExportDownloadTimer.KeyId = "";
ExportDownloadTimer.KeyValue = "";
//这个地方记录进度条关闭方法
}
},
//导出所用的方式处理
GetCookie: function (cookieName) {
var strCookie = document.cookie;
var arrCookie = strCookie.split("; ");
for (var i = 0; i < arrCookie.length; i++) {
var arr = arrCookie[i].split("=");
if (cookieName == arr[0]) {
return arr[1];
}
}
return "";
}
}
C#代码
侦听信息DownParams是前端传递的参数,必须与前端信息保持一致才能实现监控效果
if (!string.IsNullOrEmpty(DownParams) && DownParams.Split(|).Length == 2 && !string.IsNullOrEmpty(DownParams.Split(|)[0]) && !string.IsNullOrEmpty(DownParams.Split(|)[1]))
{
HttpRequest request = HttpContext.Current.Request;
HttpResponse response = HttpContext.Current.Response;
if (request != null && request.Cookies[DownParams.Split(|)[0]] != null)//先删除
{
response.Cookies.Remove(DownParams.Split(|)[0]);
}
Guard.IsNotNullOrEmpty(DownParams.Split(|)[0], "cookieName");
HttpCookie cookie = new HttpCookie(DownParams.Split(|)[0]);
cookie.Expires = DateTime.Now.AddMinutes(10);
cookie.Value = DownParams.Split(|)[1];
cookie.Path = "/"; //指定统一的Path,比便能通存通取 //设置跨域,这样在其它二级域名下就都可以访问到了
response.AppendCookie(cookie);
}
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-373807-1.html
让爱传递下去