jfinal 文件批量下载问题

请问jfinal下载单个文件可以直接用renderFile,那批量下载文件要怎么处理呢


评论区

JFinal

2019-08-16 14:59

批量下载需要你在后端将多个文件打包压缩为类似 zip、rar 的文件,再一次性下载

该功能并不是 jfinal 不想去支持,而是 http 协议只允许一次下载一个文件,其它的 web 框架也不支持

杜福忠

2019-08-16 21:55

先渲染一个下载页面,里面js循环请求下载文件,实现批量下载业务

JFinal

2019-08-16 22:04

@杜福忠 这招挺不错,赞

happyboy

2019-08-22 10:27

@杜福忠 小杜就是个人才,不过此招感觉体验不太好。

杜福忠

2019-08-22 12:15

@happyboy 需求不一样, 只是补充一种实现思路。 比如有的文件并不在服务器如云盘oss等,第三方没有提供打包功能时。 以及不想有打包时,需要单个下载的业务。 用JS模拟批量请求下载也是不错的处理方式

liangcheng2004

2019-10-30 17:33

@JFinal @杜福忠 @happyboy
我又来啦,同样在开发中遇到这类问题,总结了大家的思路,得出自己的解决方式,分享给大家:
问题场景:
1,需要从服务端下载文件,但不支持ajax请求下载的方式,只支持(a href)的方式(与交互需求不符)
2,不支持批量下载,但又不想在服务端压缩后再下载(与需求不符)
解决思路:
1,还是写个(a href),但设为隐藏
2,js中对(a href)进行参数拼接。拼接的内容为服务端的下载接口+文件路径参数
3,js中对(a href)发起模拟点击。点击的次数=批量下载的文件个数
示例如下:
1,(div style="display:none")(a id="download-xx" href="")(/a)(/div)
2,

a,因HTTP只支持a标签为文件下载方式,且不支持批量下载。因此此处是发了个a标签模拟点击事件(页面a标签设为不可见)
b,因点击事件必须有间隔,否则浏览器不处理,因此此处加了定时器。即1s点击一次。点击的次数等于下载的文件个数
c,每点击一次,对url进行参数拼接

var i=0;
var href = "../api/xxxxx/downloadAction?paths=";
var timer = setInterval(function(){
$("#download-xx").attr('href',href + filePaths[i]);//filePaths为需要批量下载的url数组
$("#download-xx")[0].click();
i += 1;
if(i == filePaths.length){
clearInterval(timer);
}
}, 1000);
至此,服务端downloadAction接口,根据接收到的path,renderFile即可.
注:因上面的内容中含html标签,回复后排版有影响。html标签的尖括号用小括号替换了。

happyboy

2019-10-30 17:34

@liangcheng2004 发个专门的分享贴

杜福忠

2019-10-30 22:31

@liangcheng2004 触发click是可以的,感觉用 for(let i in filePaths) window.location.href=href + filePaths[i] 更方便些

liangcheng2004

2019-10-31 09:43

@杜福忠 嗯,其实就是click和window.location.href这一行代码的差异,定时器还得要。for+定时器个人感觉没有现在的代码看起来简洁。

热门反馈

扫码入社