最近项目中有用到打包下载,记录一下。
1、首先引入js:
jszip/jszip.js
jszip/FileSaver.js
2、代码如下:
//传入参数:文件名称,与文件路径
function zipDownload(filePath, fileName) {
var blobs = [];
var fileNameList = [];
var resultFileNameList = [];
var req = [];
var fileRepeat = 1;//可能存在同名附件,用于拼接附件名称
for (var i = 0; i < filePath.length; i++) {
//添加匿名函数解决异步问题
(function (i) {
req[i] = new XMLHttpRequest();
fileNameList.push(fileName[i]);
req[i].open('POST', WEB_PATH + '/downloadFile', true);
req[i].responseType = 'blob';
req[i].setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
req[i].onreadystatechange = function () {
if (req[i].readyState == 4 && req[i].status == 200) {
if (req[i].response != null && req[i].response != '' && req[i].response != undefined) {
blobs.push(req[i].response);
var pushFlag = false;
for (var j = 0; j < resultFileNameList.length; j++) {
if (resultFileNameList[j] == fileName[i]) {
pushFlag = true;
var newFileName = resultFileNameList[j].split('.')[0]
+ "(" + fileRepeat + ")." + resultFileNameList[j].split('.')[1];
fileRepeat++;
resultFileNameList.push(newFileName);
}
}
if (!pushFlag) {
resultFileNameList.push(fileName[i]);
}
}
getMultiZip(blobs, fileNameList, resultFileNameList);
}
};
req[i].send("filePath=" + filePath[i]);
})(i);
}
}
function getMultiZip(blobs, fileNameList, resultFileNameList) {
var zip = new JSZip();
for (var i = 0; i < blobs.length; i++) {
zip.file(resultFileNameList[i], blobs[i], {binary: true});
}
if (blobs.length == fileNameList.length) {
zip.generateAsync({
type: 'blob',
compression: "DEFLATE", // STORE:默认不压缩 DEFLATE:需要压缩
compressionOptions: {
level: 9,
}
}).then(function (content) {
//生成zip并保存
saveAs(content,'压缩文件.zip');
});
}
}