UNPKG

simple-zip-async

Version:

旨在简化前端下载打包流程

160 lines (135 loc) 3.91 kB
'use strict'; 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;