|
本帖最后由 yy931022 于 2019-8-30 10:04 编辑
客户提了个需求,需要能批量下载附件。于是在论坛上各种搜索度娘.........但如何能在js中批量下载好像没有一人弄完整的,全是问了一半就没下文了...看了下大多数人基本都是利用Java后台下载压缩然后再进行下载,这种方法也行,但个人感觉比较繁琐。我这是用的5.2.7实现的,但步骤关键点基本对的,如果用的是其他版本的,把对应的语法换换就应该没问题的。废话不说了,直接提供代码供各位参考,如有更好的方法可以一起交流。 1、列表增加复选框,确定需要批量下载的文件
mainActivityDetail.FileDownOClick = function(event){
var PFileAttData = justep.xbl('PFileAttData');
var triggerDelay = 100;
var removeDelay = 1000;
//存放多个下载的url
var url_arr=[];
var count=PFileAttData.getCount();
for(var i=0;i<count;i++){
var fid=PFileAttData.getID(i);
var choose=PFileAttData.getValue("choose", fid);
if(choose == 1){
var path=PFileAttData.getValue("athFA", fid);
//把存储数据库的附件信息还原成原来类型json
var obj1 = eval(path);
//把获取的文件URL下载地址增加到数组里
url_arr.push(justep.Doc.getURLByFileID(obj1[0].docPath, obj1[0].fileID));
}
}
//循环数组,调用批量下载方法
url_arr.forEach(function(item,index){_createIFrame(item, index * triggerDelay, removeDelay);});
};
2、定义一个单独的方法用于循环下载(注意:这里的iframe 这个标签很重要,因为按常规的写法如果直接下载的话,永远都只能下载最后一个文件,这好像是浏览器限制啥的,反正没弄懂。上网百度了半天发现貌似只有这个标签可以解决这个问题。当然最后加载的延时也需要的,这个相信大家都懂)
function _createIFrame(url, triggerDelay, removeDelay) {
//动态添加iframe,设置src,然后删除
setTimeout(function() {
var frame = $('<iframe style="display: none;" class="multi-download"></iframe>');
frame.attr('src', url);
$(document.body).after(frame);
setTimeout(function() {
frame.remove();
}, removeDelay);
}, triggerDelay);
};
结尾:以上就是具体实现方法,个人感觉比Java实现方便的多。但还是需要从性能、业务各方面综合考虑,然后决定使用哪种。以上代码_createIFrame()这个方法下的东西可以不用动,直接COPY去用就行。只需要在你下载事件里把下载路径获取到然后传值过来就行。
|
|