前台html如下:
<div style="display: none" id="downLoadIframeDivExample">
<iframe id="downLoadZipIframe{serialNo}" name="downLoadIframe{serialNo}" style="width: 0px;height: 0px;display: none;">
</iframe>
<form id="downLoadZipForm{serialNo}" action="/grm/ecp/FileAccessServlet" target="downLoadIframe{serialNo}" method="post">
<input id="downloadFileName" type="hidden" name="name" >
<input id="downloadFileType" type="hidden" name="fileType">
<input type="hidden" name="beanId" value="">
<input type="hidden" name="method" value="">
<input id="downloadOperParams" type="hidden" name="operParams" value="" />
<input type="submit" value="" hidden="hidden">
</form>
</div>
js 如下:
function exportFileEvent(){
var rowDatas = _thisPage.gridTable.getSelectedRowData();
var $body = $("body");
//2021-01-20修改附表导出由压缩包变为多个excel
var frameHtml = $("#downLoadIframeDivExample").html();
if (rowDatas.length>0) { // 选择导出项目
for(var i=0;i<rowDatas.length;i++){
(function(i){
_thisPage.params.projectIds = rowDatas[i].projectid;
_thisPage.params.modelIds = rowDatas[i].modelid;
var zipName = rowDatas[i].projectno+"-"+rowDatas[i].projectname+"-"+rowDatas[i].createcompname;
var formHtml = frameHtml.replaceAll("{serialNo}",(i+1));
$body.append(formHtml);
var beanId = _thisPage.queryBeanId;
var method = "exportProjectFBListZip";
$("#downLoadZipForm"+(i+1)+" #downloadFileName").val(zipName);
$("#downLoadZipForm"+(i+1)+" #downloadFileType").val("xls");
$("#downLoadZipForm"+(i+1)+" #beanId").val(beanId);
$("#downLoadZipForm"+(i+1)+" #method").val(method);
$("#downLoadZipForm"+(i+1)+" #downloadOperParams").val($.toJSON({p0:_thisPage.dataContext,p1:_thisPage.typeId,p2:_thisPage.params,p3:zipName,p4:_thisPage.modelId}));
$("#downLoadZipForm"+(i+1)).attr("action","/grm/ecp/FileAccessServlet?beanId="+beanId+"&method="+method);
$("#downLoadZipForm"+(i+1)).submit();
}(i));
}
}
}
由于下载文件只有一个入口,所以在这里使用循环的方式提交请求。一个请求对应一个iframe,所以在html中使用{serialNo}作为模板,在js中循环替换生成多个iframe,downLoadZipForm:form表单最好也是生成多个的,和iframe对应起来。
<input type="submit" value="" hidden="hidden">
需要设置成hidden,测试时会在页面上显示出来。
js 中涉及到js闭包。