Skip to content
目录

下载相关

1. 创建 a 链接并下载文件(导出 excel)

js
/**
 * @description: 导出excel
 * @param {binary} data 导出excel 二进制数据
 * @param {string} fileName 导出excel文件名字,带后缀
 * @Author: zhs
 */
export const exportExcel = (data, fileName) => {
  if (!data) {
    return;
  }
  // 判断是否是二进制数据
  const isArrayBuffer = data instanceof ArrayBuffer || data instanceof Blob;
  window.URL = window.URL || window.webkitURL; // 兼容性
  // 创建一个 URL 这个 URL 的生命周期和创建它的窗口中的 document 绑定。这个新的URL 对象表示指定的 File 对象或 Blob 对象。
  let url = isArrayBuffer ? window.URL.createObjectURL(new Blob([data])) : data;
  let link = document.createElement("a"); // 创建一个a元素
  link.style.display = "none"; // 让a元素在页面中隐藏
  link.href = url; // 绑定 a 元素的 href 为当前的url
  let exportName = fileName || "导出明细.xlsx";
  link.setAttribute("download", exportName); // 设置 a 元素 download属性(下载保存的文件名称),属性值为后面的值
  link.setAttribute("target", "_blank"); // 设置 a 元素 target属性,再开一个标签页打开或者下载
  document.body.appendChild(link); // 添加到页面中
  link.click(); // 点击a元素 下载excel文件
  window.URL.revokeObjectURL(url); //卸载url,释放内存
};
//   // 判断是否是二进制数据
//   const isArrayBuffer = data instanceof ArrayBuffer || data instanceof Blob;
//   // 兼容性
//   window.URL = window.URL || window.webkitURL
//   // 1. 创建链接
//   let url = isArrayBuffer ? window.URL.createObjectURL(new Blob([data])) : data;
//   // 2. 创建 a 链接
//   let link = document.createElement('a')
//   // 3. 让这个 a 链接在页面中隐藏
//   link.style.disl=play = 'none'
//   // 4. 绑定 a 元素的href 为创建的url链接
//   link.href = url
//   // 5. 指定文件名称
//   let exportName = fileName || '导出明细'
//   // 6. 设置 a 元素的 download 属性,属性值为后面的值 setAttribute('属性名','属性值')
//   link.setAttribute('download',`${exportName}.xlsx`)
//   // 7. 将 a 元素添加到页面中
//   document.body.appendChild(link)
//   // 8. 点击 a 元素进行下载 excel 文件
//   link.click()
//   // 9. 卸载url,释放内存
//   window.URL.removeObjectURL(url)

2. 将 json 数据转化为 demo.json 并下载文件

exportExcel为 1 的方法

JSON.stringify(value[, replacer [, space]]) 参考文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

js
const json = { a: 3, b: 4, c: 5 };
const str = JSON.stringify(json, null, 2);
// 方案一:Text -> DataURL
const dataUrl = `data:,${str}`;
exportExcel(dataUrl, "demo.json");

// 方案二:Text -> blob -> ObjectURL
const url = URL.createObjectURL(new Blob(str.split("")));
exportExcel(url, "demo1.json");

3. 根据链接下载文件 相关

  • 2.1 需要用到的插件
js
pnpm i  jszip && pnpm i file-saver
js
// 需要用到的插件
import JSZip from "jszip";
import FileSaver from "file-saver";
  • 2.2 单个文件下载
js
/**
 * @description: 单个文件下载 导出excel
 * @param {string} url 下载的url
 * @param {string} name 下载文件的名字 带后缀
 * @Author: zhs
 */
export const singleExportFile = (url, name) => {
  if (!name) {
    FileSaver.saveAs(url); // 未传入导出文件名称
  } else {
    FileSaver.saveAs(url, name); // 通过fileSaver导出下载文件
  }
};
  • 2.3 批量图片压缩导出下载
Details
js
/**
 * @description:   将文件链接转为 二进制文件 创建链接 转为 blob 并请求
 * @param {string} url 要下载的文件链接
 */
function getImgArrayBuffer(url) {
  return new Promise((resolve, reject) => {
    //通过请求获取文件blob格式
    let xmlHTTP = new XMLHttpRequest();
    xmlHTTP.open("GET", url, true);
    xmlHTTP.responseType = "blob";
    xmlHTTP.onload = function () {
      if (this.status == 200) {
        resolve(this.response);
      } else {
        reject(this);
      }
    };
    xmlHTTP.send();
  });
}
/**
 * @description:批量文件导出
 * @param {Arrray} list 要下载的文件链接列表数组
 * @param list 格式 [{name:"",url:""}],name:名称带后缀,如a.pdf,b.png
 * @param {String} fileName 导出完成后的压缩文件名称
 * @Author: zhs
 */
export const batchExportFile = (list, fileName = "压缩文件") => {
  let zip = new JSZip();
  let promises = [];
  for (let obj of list) {
    const promise = getImgArrayBuffer(obj.url)
      .then((data) => {
        // obj.name: 文件名称,带后缀, data:文件内容,
        zip.file(obj.name, data, { binary: true }); // 逐个添加文件
      })
      .catch((error) => {
        console.log(error);
      });
    promises.push(promise);
  }
  // console.log(promises)
  // return
  Promise.all(promises).then(async () => {
    try {
      const content = await zip.generateAsync({ type: "blob" });
      await FileSaver.saveAs(content, fileName);
    } catch (error) {
      console.log(error);
    }
  });
};

4. excel 导入相关

  • 3.1 下载的插件
js
pnpm i xlsx@0.18.5
  • 3.2 按照二进制方式读取文件
js
import * as XLSX from "xlsx";

/**
 * @description:  把文件按照二进制方式读取
 * @param {binary} file :文件
 */
export const readFile = (file) => {
  return new Promise((resolve) => {
    let reader = new FileReader();
    // 二进制
    reader.readAsBinaryString(file);
    reader.onload = (ev) => {
      resolve(ev.target.result);
    };
  });
};
  • 3.3 按照 base64 方式读取文件
js
/**
 * @description: 把文件按照base64方式读取
 * @param {binary} file
 */
export const readFileBase = (file) => {
  return new Promise((resolve) => {
    let reader = new FileReader();
    // base64
    reader.readAsDataURL(file);
    reader.onload = (ev) => {
      resolve(ev.target.result);
    };
  });
};
  • 3.4 导入的 excel 文件读取是中文表头的,需要转换为相应的 英文字段
js
/**
 * @description: 将excel中文表头转换为对应的字段
 * @param {Array} excelData: 导入的excel列表数据
 * @param {Object} header : excel列表中文表头和字段对应的映射
 */
export const changeCnToEnFn = (excelData, header) => {
  let result = [];
  excelData.forEach((obj) => {
    let info = {};
    Object.keys(header).forEach((key) => {
      info[header[key]] = obj[key];
    });
    result.push(info);
  });
  return result || [];
};
  • 3.5 将导入的 excel 文件转换为 json 格式
js
/**
 * @description: 将导入的excel文件转换为json格式
 * @param {*} file :转换的文件
 */
export const excelToJson = async (excelFile) => {
  // 将文件内容转换为二进制文件
  let binaryData = await readFile(excelFile);
  // 将二进制数据通过 XLSX.read(fileData, { type: "binary" }) 方法生成 workbook 对象 type :'binary' 类型为二进制
  let eleData = XLSX.read(binaryData, { type: "binary" });
  //  eleData.SheetNames[0] 获取第一个 Sheet 的名称,有多个,其实就是第一个表格的名字
  //  eleData.Sheets 根据eleData.SheetNames[0]为key存的数据内容
  let eleDataSheet = eleData.Sheets[eleData.SheetNames[0]];
  // 将解析出的数据转换为json格式
  eleData = XLSX.utils.sheet_to_json(eleDataSheet);
  // 判断是否有表格头 现在单元格的合并对表格头会有一些影响,目前用是否有 __EMPTY_1 字段来判断是否有表格头(单元格合并的话不会有 __EMPTY)
  const hasTableHead = !!eleData[0].__EMPTY_1;
  // 有表头转换后的数据格式
  let tableDataArr = [];
  // 有表头
  if (hasTableHead) {
    // 获取表头数据,并且去除获取的表格中的表头(就是第一行为表格数据,去除掉)
    const header = eleData.shift();
    eleData.forEach((obj) => {
      let info = {};
      Object.keys(header).forEach((key) => {
        info[header[key]] = obj[key] || "";
      });
      tableDataArr.push(info);
    });
    return tableDataArr;
  } else {
    return eleData;
  }
};

5. 本地缓存相关

window.localStorage
js
/**
 * @description: window.localStorage 浏览器永久缓存
 * @return {*}
 */
export const localStorage = {
  // 设置
  set(key, val) {
    if (key) {
      window.localStorage.setItem(key, JSON.stringify(val));
    }
  },
  // 获取
  get(key) {
    const result = window.localStorage.getItem(key);
    if (result) {
      return JSON.parse(result);
    }
  },
  // 移除
  remove(key) {
    if (key) {
      window.localStorage.removeItem(key);
    }
  },
  // 清除全部
  clear() {
    window.localStorage.clear();
  },
};
window.sessionStorage
js
/**
 * @description: window.sessionStorage 浏览器临时缓存
 * @return {*}
 */
export const sessionStorage = {
  // 设置
  set(key, val) {
    window.sessionStorage.setItem(key, JSON.stringify(val));
  },
  // 获取
  get(key) {
    const result = window.sessionStorage.getItem(key);
    if (result) {
      return JSON.parse(result);
    }
  },
  // 移除临时缓存
  remove(key) {
    window.sessionStorage.removeItem(key);
  },
  // 移除全部临时缓存
  clear() {
    window.sessionStorage.clear();
  },
};
cookie
js
/**
 * @description:  cookie
 * @return {*} 参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Document/cookie
 */

export const docCookies = {
  // 获取
  getItem: function (sKey) {
    return (
      decodeURIComponent(
        document.cookie.replace(
          new RegExp(
            "(?:(?:^|.*;)\\s*" +
              encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +
              "\\s*\\=\\s*([^;]*).*$)|^.*$"
          ),
          "$1"
        )
      ) || null
    );
  },
  // 设置
  setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
    if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) {
      return false;
    }
    var sExpires = "";
    if (vEnd) {
      switch (vEnd.constructor) {
        case Number:
          sExpires =
            vEnd === Infinity
              ? "; expires=Fri, 31 Dec 9999 23:59:59 GMT"
              : "; max-age=" + vEnd;
          break;
        case String:
          sExpires = "; expires=" + vEnd;
          break;
        case Date:
          sExpires = "; expires=" + vEnd.toUTCString();
          break;
      }
    }
    document.cookie =
      encodeURIComponent(sKey) +
      "=" +
      encodeURIComponent(sValue) +
      sExpires +
      (sDomain ? "; domain=" + sDomain : "") +
      (sPath ? "; path=" + sPath : "") +
      (bSecure ? "; secure" : "");
    return true;
  },
  // 移除
  removeItem: function (sKey, sPath, sDomain) {
    if (!sKey || !this.hasItem(sKey)) {
      return false;
    }
    document.cookie =
      encodeURIComponent(sKey) +
      "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" +
      (sDomain ? "; domain=" + sDomain : "") +
      (sPath ? "; path=" + sPath : "");
    return true;
  },
  hasItem: function (sKey) {
    return new RegExp(
      "(?:^|;\\s*)" +
        encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +
        "\\s*\\="
    ).test(document.cookie);
  },
  keys: /* optional method: you can safely remove it! */ function () {
    var aKeys = document.cookie
      .replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "")
      .split(/\s*(?:\=[^;]*)?;\s*/);
    for (var nIdx = 0; nIdx < aKeys.length; nIdx++) {
      aKeys[nIdx] = decodeURIComponent(aKeys[nIdx]);
    }
    return aKeys;
  },
};