问题:如何打包下载文件服务器文件?
老方法是在后端将远程文件从文件服务器上下载到后端服务器,然后将打包后的文件链接返回给前端,然后前端再下载,这样就会导致两次下载,非常慢
解决:后端返回文件服务器中文件链接,然后前端下载远程文件并打包
方法:
1、后端返回需要打包下载的文件夹及文件列表,最好组装成一个数组
如:
[
{
"n": "\u4e00",
"p": "\u4e00",
"t": "d"
},
{
"n": "111",
"p": "\u4e00/111",
"t": "d"
},
{
"n": "22",
"p": "\u4e00/111/22",
"t": "d"
},
{
"n": "date_info.txt",
"p": "\u4e00/111/22",
"l": "http://10.16.32.80/group1/M00/00/39/ChAgYmSXsvSAdedHAACTMxFor5I924.txt",
"t": "f"
},
{
"n": "base_roles.txt",
"p": "\u4e00/111",
"l": "http://10.16.32.80/group2/M00/00/39/ChAgY2SXst6AFuecAAAB7z6Nwvw682.txt",
"t": "f"
}
]
前端代码:
1、先引入jszip、jszip-utils
<script src="/static/js/jszip.min.js"></script>
<script src="/static/js/jszip-utils.min.js"></script>
2、处理后端返回的数组
$.post('/api/batch/download',{'fids': fids, 'rids': rids,
},function(data){
if(data.code){
alert('', data.msg);
return false;
}
var files_data = data.files_data;
var time_str = data.time_str;
var total = files_data.length;
var num = 0;
const zip = new JSZip();
files_data.map(function(file){
if(file['t'] == 'd'){
zip.folder(file['p']);
++num;
}else if(file['t'] == 'f'){
var path = zip.folder(file['p']);
// 获取远程文件
JSZipUtils.getBinaryContent(file['l'], function(err, binData){
++num;
path.file(file['n'], binData, {binary: true});
if(num == total){
zip.generateAsync({type:"blob"}).then(function(content) {
const link = document.createElement('a');
link.href = window.URL.createObjectURL(content);
link.download = 'resource_'+ time_str +'.zip';
link.click();
link.remove();
});
}
});
}
});
});
参考:
https://zhuanlan.zhihu.com/p/135384758
https://github.com/Stuk/jszip-utils
https://github.com/Stuk/jszip
https://gitee.com/mirrors/jszip