simple-zip-async
Version:
旨在简化前端下载打包流程
160 lines (135 loc) • 3.91 kB
JavaScript
;
var JSZip = require('jszip');
var fileSaver = require('file-saver');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var JSZip__default = /*#__PURE__*/_interopDefaultLegacy(JSZip);
const JSZipUtils = {
_getBinaryFromXHR: "",
getBinaryContent: "",
};
JSZipUtils._getBinaryFromXHR = function (xhr) {
return xhr.response || xhr.responseText;
};
function createStandardXHR() {
try {
return new window.XMLHttpRequest();
} catch (e) {
console.error(e);
}
}
function createActiveXHR() {
try {
return new window.ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
console.error(e);
}
}
const createXHR =
typeof window !== "undefined" && window.ActiveXObject
? function () {
return createStandardXHR() || createActiveXHR();
}
: createStandardXHR;
JSZipUtils.getBinaryContent = function (path, options) {
let promise;
let resolve;
let reject;
let callback;
if (!options) {
options = {};
}
if (typeof options === "function") {
callback = options;
options = {};
} else if (typeof options.callback === "function") {
callback = options.callback;
}
if (!callback && typeof Promise !== "undefined") {
promise = new Promise((_resolve, _reject) => {
resolve = _resolve;
reject = _reject;
});
} else {
resolve = function (data) {
callback(null, data);
};
reject = function (err) {
callback(err, null);
};
}
try {
const xhr = createXHR();
xhr.open("GET", path, true);
if ("responseType" in xhr) {
xhr.responseType = "blob";
}
if (xhr.overrideMimeType) {
xhr.overrideMimeType("text/plain; charset=x-user-defined");
}
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200 || xhr.status === 0) {
try {
resolve(JSZipUtils._getBinaryFromXHR(xhr));
} catch (err) {
reject(new Error(err));
}
} else {
reject(
new Error(
`Ajax error for ${path} : ${this.status} ${this.statusText}`
)
);
}
}
};
xhr.setRequestHeader("Access-Control-Allow-Origin", "*");
xhr.setRequestHeader("Cache-Control", "no-cache");
xhr.setRequestHeader("Content-type", "application/octet-stream");
if (options.progress) {
xhr.onprogress = function (e) {
options.progress({
path,
originalEvent: e,
percent: (e.loaded / e.total) * 100,
loaded: e.loaded,
total: e.total,
});
};
}
xhr.send();
} catch (e) {
reject(new Error(e), null);
}
return promise;
};
const fetchData = (zip, list) =>
new Promise((resolve) => {
list.forEach((item) => {
const { url, files } = item;
JSZipUtils.getBinaryContent(url, (err, data) => {
if (err) {
console.error(`批量下载遇到问题: ${files[0].name}`);
} else {
files.forEach((subItem) => {
const { binary, content, name } = subItem;
if (content) {
zip.file(name, content.join("\n"), { binary });
} else {
zip.file(name, data, { binary });
}
});
if (Object.keys(zip.files).length === list.length * files.length) {
resolve(zip);
}
}
});
});
});
const simpleZip = async (list) => {
const zip = new JSZip__default['default']();
await fetchData(zip, list);
const content = await zip.generateAsync({ type: "blob" });
fileSaver.saveAs(content, `${new Date().getTime()}.zip`);
};
module.exports = simpleZip;