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

QQ登录

只需一步,快速开始

查看: 5385|回复: 2

[分享] js附件批量下载

  [复制链接]

37

主题

67

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
QQ
发表于 2019-8-30 10:18:33 | 显示全部楼层 |阅读模式
版本: X5.2.7 小版本号:
数据库: MS SQLServer 服务器操作系统: Windows 应用服务器: Tomcat
客户端操作系统: Windows 7 浏览器: Chrome
客户提了个需求,需要能批量下载附件。于是在论坛上各种搜索度娘.........但如何能在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去用就行。只需要在你下载事件里把下载路径获取到然后传值过来就行。

37

主题

67

帖子

238

积分

中级会员

Rank: 3Rank: 3

积分
238
QQ
 楼主| 发表于 2019-8-30 10:32:27 | 显示全部楼层
补充一点,需要引用/UI/system/service/doc/docUtil.js,不然你获取下载路径那个方法会报错
回复 支持 反对

使用道具 举报

532

主题

2107

帖子

4308

积分

论坛元老

起步萌新

Rank: 8Rank: 8

积分
4308
发表于 2019-9-29 14:25:17 | 显示全部楼层
yy931022 发表于 2019-8-30 10:32
补充一点,需要引用/UI/system/service/doc/docUtil.js,不然你获取下载路径那个方法会报错 ...

不错不错,这种是属于批量下载。有的客户需求是要打包的,那样只能用java了吧。

还有个问题:批量的话,能否选择文件存放目录呢?
及时结贴是个好习惯
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 12:41 , Processed in 0.058044 second(s), 25 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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