原生JS下载

577 阅读1分钟

window.open & location.href

window.open('下载地址或后端接口')
location.href = '下载地址或后端接口'

a 标签实现下载

tip:要确定后端给的是什么格式的文件,是否是二进制文件流文件

可用链接直接下载

//拿到的图片为图片文件,如:base64编码后的图片
function downFile() {
  const el = document.createElement('a');
  el.href = '下载地址或后端接口';
  el.setAttribute('download', '可选,下载文件的名字');
  document.body.appendChild(el);
  el.click();
  document.body.removeChild(el);
}

二进制文件流下载

Blob() 构造函数返回一个新的 Blob 对象。 blob的内容由参数数组中给出的值的串联组成。

var aBlob = new Blob( array, options );
//如果是二进制流文件,需要加请求头类型
function downFile() {
  const { data } = await axios({
    method: "POST",
    url: `${APIS.permission.import}`,
    data: form,
    responseType: "blob",
  });
  const blob = URL.createObjectURL(new Blob([data]));
  const el = document.createElement("a");
  el.setAttribute("download", "配置导入模板下载.xlsx");
  el.href = blob;
  document.body.appendChild(el);
  el.click();
  document.body.removeChild(el);
} 

iframe下载

function download(url) {
  const iframe = document.createElement('iframe');
  iframe.style.display = 'none';
  function iframeLoad() {
    console.log('iframe onload');
    const win = iframe.contentWindow;
    const doc = win.document;
    if (win.location.href === url) {
      if (doc.body.childNodes.length > 0) {
        // response is error
      }
      iframe.parentNode.removeChild(iframe);
    }
  }
  if ('onload' in iframe) {
    iframe.onload = iframeLoad;
  } else if (iframe.attachEvent) {
    iframe.attachEvent('onload', iframeLoad);
  } else {
    iframe.onreadystatechange = function onreadystatechange() {
      if (iframe.readyState === 'complete') {
        iframeLoad;
      }
    };
  }
  iframe.src = '';
  document.body.appendChild(iframe);

  setTimeout(function loadUrl() {
    iframe.contentWindow.location.href = url;
  }, 50);
}