IE下载文件前端重命名

兼容性要求不高的情况下可以用a标签的download属性,HTML5新增的

export function open (url, name) {
  let a = document.createElement('a')
  a.target = '_blank'
  a.setAttribute('href', url)
  if (name) {
    a.setAttribute('download', name)
  }
  a.style.display = 'none'
  document.body.appendChild(a)
  let e = document.createEvent('MouseEvents')
  e.initEvent('click', true, true)
  a.dispatchEvent(e)
  setTimeout(() => {
    document.body.removeChild(a)
  }, 1000)
}

以下情况可以支持


download属性支持情况

可以看到,万恶的IE不支持,所以下载下来就是后端指定的名称或者默认名称

前端重命名文件名还有另一种方法:Blob

async download (url, name) {
  if (window.navigator.msSaveBlob) { // msSaveBlob仅支持IE10+
    const res = await api().get(url) // 获取到文件的二进制流
    const blob = new Blob([res], { type: 'application/json;charset=utf-8' }) // application/vnd.openxmlformats-officedocument.wordprocessingml.document这里表示doc类型
    const href = window.URL.createObjectURL(blob) // 创建下载的链接
    try {
      window.navigator.msSaveBlob(blob, name)
    } catch (e) {
      console.log(e)
    }
    window.URL.revokeObjectURL(href)
  } else {
    open(url, name) // 上面那个open函数
  }
}

但是这种方法有一些弊端:

  • 消耗内存,下载大文件可能会崩
  • 点击下载之后,IE浏览器会先把文件下载到电脑(此时浏览器看起来没有任何反应),等下载完成再提示:是否保存文件;所以需要你手动在点击下载的时候加个toast提示之类的

所以我觉得最好的办法就是在后端返回文件名,既保证兼容性,又不占内存

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 面试题一:https://github.com/jimuyouyou/node-interview-questio...
    R_X阅读 1,689评论 0 5
  • 前端开发面试题 面试题目: 根据你的等级和职位的变化,入门级到专家级,广度和深度都会有所增加。 题目类型: 理论知...
    怡宝丶阅读 2,625评论 0 7
  • 前端开发知识点 HTML&CSS对Web标准的理解、浏览器内核差异、兼容性、hack、CSS基本功:布局、盒子模型...
    Hebborn_hb阅读 858评论 0 1
  • 这应该是你见过的最全前端下载总结 自己整理的一些项目中遇到过的关于上传和下载的一些Demo,大前端系列(也就是纯前...
    周小肆阅读 1,697评论 1 12
  • @转自GitHub 介绍js的基本数据类型。Undefined、Null、Boolean、Number、Strin...
    YT_Zou阅读 1,234评论 0 0