ajax实现下载等待

该方法先发一个请求到后台去生成Excel,并把生成的Excel文件保存在服务器上的临时文件夹。然后通过ajax返回Excel文件在服务器上的路径或者文件标记。ajax客户端收到服务器返回的结果,再通过iframe或者form发起请求去下载Excel文件。这个方法需要客户端发两次请求到后台,第一次是请求后台生成Excel文件,第二次是请求下载Excel文件。 这个方法不存在任何兼容性以及限制,推荐使用。

<script type="text/javascript" src="<s:url value="/js/jquery.blockUI.js" encode="false"/>"></script>
 <a href="#" class="w120" onclick="form_download('<s:url value="/mng_usr!download" />'); return false;">下载</a>
function form_download(url) {
    if (window.confirm('确定下载吗?')) {
    var imgUrl="http://localhost:8080/admin/images/indicator.gif";
    $.blockUI({
            message: '<div><img src="'+imgUrl+'" style="margin-right:5px;"  />データ取得中…</div>',
            css: {
                padding:'25px'
            }
        });
    var form = $("<form name='formDownload' id='formDownload'></form>"); 
    form.attr('method', 'post');
    form.attr('action', url);
    $('body').append(form); 
    form.submit();
    $.ajax({
    url:url,
    cache:false,
    data:{},
    dataType : "json",
    contentType : "application/json:charset=utf-8",
    success:function (data){
    $.unblockUI();
    },
    error:function(e){
    $.unblockUI();
    }
    }); 
    }
}

iframe实现下载等待

用iframe实现下载等待的原理是把下载的路径给iframe的src,然后监听iframe的onload事件,当后台处理完成并返回文件时,会触发iframe的onload事件。使用该方法有两个问题:

参数通过url传递,如果url长度超过2048会被浏览器截断。

iframe的onload事件在ie浏览器下触发不符合要求。

 参考:

http://blog.csdn.net/accountwcx/article/details/46728563

1. 使用ajax,ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的发送,接受都只能是string字符串,不能流类型,所以无法实现文件下载,强用会出现response冲突。如果非要使用ajax的话,只能通过返回值得到生成的文件相关url。然后在回调函数里通过创建一个iframe,并设置其src值为文件url,或者一个对文件生成流的处理url,这样操作来实现文件下载且页面无刷新。

有参数传递的情况

var title=$("input[name='gjzSelect']").val();
var rqTime = $(".ui-datepicker-time").val();
var ddd= rqTime.split("一");
var startTime=ddd[];
var endTime=ddd[];
var form = $("<form></form>"); //定义一个form表单
form.attr('style', 'display:none'); //在form表单中添加查询参数
form.attr('target', '');
form.attr('method', 'post');
form.attr('action', "<%=basePath%>jiankong/madeExcel.do");
var input = $('<input>');
input.attr('type', 'hidden');
input.attr('name', 'startTime');
input.attr('value', startTime);
var input = $('<input>');
input.attr('type', 'hidden');
input.attr('name', 'endTime');
input.attr('value', endTime);
var input = $('<input>');
input.attr('type', 'hidden');
input.attr('name', 'title');
input.attr('value', title);
$('body').append(form); //将表单放置在web中
form.append(input); //将查询参数控件提交到表单上
form.append(input);
form.append(input);
form.submit();
<%-- 
$.ajax({
url:'<%=basePath%>jiankong/madeExcel.do',
cache:false,
data:{
'startTime':startTime,
'endTime':endTime,
'title' :title
},
error:function (e){
alert("导出失败!");
},
success:function (data){
alert("导出成功!");
} 
}); 
--%>