美文网首页
js下载文件

js下载文件

作者: 3e2235c61b99 | 来源:发表于2022-01-04 11:22 被阅读0次

参考
项目中需要下载文件,后台兄弟返回的是个blob
下面的代码是在之前的项目中使用的工具方法,这个方法是把返回的base64下载为文件

export function downloadFile (fileName, content) {
  const blob = base64ToBlob(content); // new Blob([content]);
  if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, fileName);
  } else {
    const link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;

    //此写法兼容可火狐浏览器
    document.body.appendChild(link);
    const evt = document.createEvent("MouseEvents");
    evt.initEvent("click", false, false);
    link.dispatchEvent(evt);
    document.body.removeChild(link);
  }
}

function base64ToBlob (code) {
  const parts = code.split(';base64,');
  const contentType = parts[0].split(':')[1];
  const raw = window.atob(parts[1]);
  const rawLength = raw.length;
  const uInt8Array = new Uint8Array(rawLength);
  for (let i = 0; i < rawLength; ++i) {
    uInt8Array[i] = raw.charCodeAt(i);
  }
  return new Blob([uInt8Array], { type: contentType });
}

本来想着直接改成下面这样就能用的:

export function downloadFile (fileName, content) {
  const blob = new Blob([content]);
  if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, fileName);
  } else {
    const link = document.createElement('a');
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;

    //此写法兼容可火狐浏览器
    document.body.appendChild(link);
    const evt = document.createEvent("MouseEvents");
    evt.initEvent("click", false, false);
    link.dispatchEvent(evt);
    document.body.removeChild(link);
  }
}

结果文件下载下来了,但是打不开,这就很气了
找了半天,看到有人说是mock的原因,但是我看了我的项目,已经把mock删掉了,而且返回格式好像也没问题,request并没有被改为MockXMLHttpRequest
最后发现需要在发送请求时,设置responseType: 'blob'

// 问题代码
export function downloadFun(data) {
  return request({
    url: '/system/download',
    method: 'post',
    data: data
  })
}

// 解决方案
export function downloadFun(data) {
  return request({
    url: '/system/download',
    method: 'post',
    data: data,
    responseType: 'blob'
  })
}

相关文章

  • laydate 时间选择器组建(一)

    效果图展示 需要引入的js文件 文件下载 html代码 js代码

  • js 文件下载

    项目中我们经常会遇到需要下载文件的功能,静态的文件资源可以使用 a 标签下载,动态的则需要我们通过 js 处理,s...

  • js文件下载

    var a = document.createElement('a');a.href = "url;a.downl...

  • js 下载 文件

    创建upload.js 文件 在需要下载的页面引入

  • js 文件 下载

  • js文件下载

    1.文件流下载 根据后台接口文件流下载 调用 2.文件地址下载 根据文件地址下载文件 调用 3.base64流下载...

  • js -文件下载

    纯前端实现 主要通过a标签的href属性来实现下载功能, download属性规定被下载的超链接目标;downlo...

  • 文件上传下载 antd Upload

    文件上传 antd Upload 入口 UploadUtil.js 文件下载 入口 FileUtil.js api...

  • Vue 使用axios

    1、下载axois 2、在src文件夹在创建http.js文件 3、在main.js 引入http.js文件

  • js-文件的上传和下载

    js-文件的上传和下载

网友评论

      本文标题:js下载文件

      本文链接:https://www.haomeiwen.com/subject/ysjqcrtx.html