文件加密下载

70 阅读2分钟
加密方法
@/utils/aseEncrypt.js文件
import CryptoJS from "crypto-js";
/**
 * 下载 加密入参
 * @word 要加密的内容
 * @keyWord String
 *  */
const AES_KEY = "c19fb27e0cf61482a38819fbe5e29e17";
const AES_IV = "0102030405060708";
const key = CryptoJS.enc.Utf8.parse(AES_KEY);
const iv = CryptoJS.enc.Utf8.parse(AES_IV);

export function aesEncrypt(word) {
  const srcs = CryptoJS.enc.Utf8.parse(word);
  const encrypted = CryptoJS.AES.encrypt(srcs, key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
}
// AES对称解密
export function aseDecrypt(word) {
  const decrypted = CryptoJS.AES.decrypt(word, key, {
    iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return CryptoJS.enc.Utf8.stringify(decrypted).toString();
}

文件下载
fileUpload.js
import axios from "axios";
import { Message } from "element-ui";
import { getToken } from "@/utils/auth";
import store from "../store";
import Cookies from "js-cookie";
import { aesEncrypt } from "@/utils/aseEncrypt";
/**
 * 文件流下载
 * @param {*} data Blob | BufferSource | string 文件流
 * @param {*} filename string 文件名
 * @param {*} mime string 类型 可选
 * @param {*} bom Blob | BufferSource | string 可选
 */
export function downloadByData(data, filename, mime, bom) {
  const blobData = typeof bom !== "undefined" ? [bom, data] : [data];
  const blob = new Blob(blobData, { type: mime || "application/octet-stream" });

  const blobURL = window.URL.createObjectURL(blob);
  const tempLink = document.createElement("a");
  tempLink.style.display = "none";
  tempLink.href = blobURL;
  tempLink.setAttribute("download", filename);
  if (typeof tempLink.download === "undefined") {
    tempLink.setAttribute("target", "_blank");
  }
  document.body.appendChild(tempLink);
  tempLink.click();
  document.body.removeChild(tempLink);
  window.URL.revokeObjectURL(blobURL);
}

/**
 * 通过在线链接下载
 * @param {*} url string 文件地址
 * @param {*} target 窗口打开方式 "_self" | "_blank"
 * @param {*} fileName 文件名称
 */
export function downloadByUrl({ url, target = "_blank", fileName }) {
  const isChrome =
    window.navigator.userAgent.toLowerCase().indexOf("chrome") > -1;
  const isSafari =
    window.navigator.userAgent.toLowerCase().indexOf("safari") > -1;

  if (/(iP)/g.test(window.navigator.userAgent)) {
    console.error("Your browser does not support download!");
    return false;
  }
  if (isChrome || isSafari) {
    const link = document.createElement("a");
    link.href = url;
    link.target = target;

    if (link.download !== undefined) {
      console.log("url", url);
      link.download =
        fileName || url.substring(url.lastIndexOf("/") + 1, url.length);
    }

    if (document.createEvent) {
      const e = document.createEvent("MouseEvents");
      e.initEvent("click", true, true);
      link.dispatchEvent(e);
      return true;
    }
  }
  if (url.indexOf("?") === -1) {
    url += "?download";
  }

  openWindow(url, { target });
  return true;
}

/**
 * 通过后台接口下载
 * @param {*} url string 下载接口url
 * @param {*} params 入参
//  * @param {*} fileName 文件名称
 * @param {*} method 请求方法 可选
 */
export function downloadByAxios(
  data,
  url = "/common/downloadFile",
  method = "POST"
) {
  if (
    typeof data == "object" &&
    Object.prototype.toString.call(data).toLowerCase() == "[object object]" &&
    !data.length &&
    Object.keys(data).length
  ) {
    console.log("下载入参 data", data);
    let rsaData = aesEncrypt(JSON.stringify(data.data));
    let params = { ...data, buryingPoint: rsaData };
    if (params.hasOwnProperty("data")) {
      delete params.data;
    }

    const service = axios.create({
      // axios中请求配置有baseURL选项,表示请求URL公共部分
      baseURL: process.env.VUE_APP_BASE_API
    });
    return service
      .request({
        url,
        method,
        headers: {
          "Content-Type": "application/x-download;charset=utf-8",
          // "Content-Type": "application/x-www-form-urlencoded",
          Authorization: getToken()
        },
        responseType: "blob",
        params
      })
      .then(res => {
        const data = res.data;
        // 可以从这里获取文件名 或者下载文件的时候传入
        let fileName = "";
        if (
          res.headers["content-disposition"] ||
          res.headers["Content-Disposition"]
        ) {
          try {
            fileName = res.headers["content-disposition"].replace(
              /\w+;filename=(.*)/,
              "$1"
            );
          } catch (error) {
            fileName = res.headers["Content-Disposition"].replace(
              /\w+;filename=(.*)/,
              "$1"
            );
          }
        } else {
          fileName = res.data.fileName;
        }
        const isBlob = res.data.type !== "application/json";
        if (isBlob) {
          const blob = new Blob([res.data]);
          downloadByData(blob, decodeURIComponent(fileName));
        } else {
          Message.error("下载文件出现错误");
        }
      })
      .catch(r => {
        console.log("r", r.response.status);
        if (r.response.status === 401) {
          store.dispatch("LogOut").then(() => {
            // 用户登录界面提示
            Cookies.set("point", 401);
            location.reload();
          });
        } else {
          Message.error("下载文件出现错误");
        }
      });
  } else {
    console.error("下载文件: 入参为空或错误");
  }
}