起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2055|回复: 0

如何在JS中进行附件批量下载

[复制链接]

37

主题

67

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
QQ
发表于 2019-8-30 09:31:51 | 显示全部楼层 |阅读模式
本帖最后由 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去用就行。只需要在你下载事件里把下载路径获取到然后传值过来就行。

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-4-25 12:25 , Processed in 0.083426 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表