Vue a标签实现点击下载,下载图片、txt文件,不是直接打开的方式

前段时间在项目中遇到文件需要下载,直接拿出了之前封装的下载指令,在用的时候发现在下载jpg、txt文件时,并不会直接下载,而是会在浏览器中打开文件,即使给a标签添加了download
属性,也无济于事。
我先把之前封装的指令贴出来吧,如果下载文件类型只是Exact、Word、Pdf格式的可以直接拿着用,如果有其他文件类型需求的,可以继续往文章下面看

  • 支持Exact、Word、Pdf格式下载
let baseDownloadUrl = 'https://xxxxx.cn'  // 域名
// 添加自定义v-down指令
Vue.directive('down', {
    inserted: (el, binding) => {
        el.style.cssText = 'cursor: pointer;color:red;'
        el.addEventListener('click', () => {
            console.log(binding.value)
            let link = document.createElement('a')  // 创建a标签
            link.style.display = 'none'
            link.href = baseDownloadUrl + binding.value // 设置下载地址
            link.setAttribute('download', '') // 添加downLoad属性
            document.body.appendChild(link)
            link.click()
        })
    }
})

Vue页面中使用指令v-down

<span v-down="item.Url">(附件)</span>
  • 当下载文件中存在jpg、txt等浏览器可以直接预览的文件时,上面的方法就会出现问题,即使加了download仍然会在浏览器中打开下载文件
    我们可以将下载地址借助Blob转换成二进制,然后,作为a标签的href属性,配合download属性,实现下载。
    具体实现代码如下:
Vue.directive('down', {
  inserted: (el, binding) => {
    el.style.cssText = 'cursor: pointer;color:write;'
    el.addEventListener('click', () => {
      console.log(binding.value)
      let link = document.createElement('a')
      let url = baseDownloadUrl + binding.value
      // 这里是将url转成blob地址,
      fetch(url).then(res => res.blob()).then(blob => { // 将链接地址字符内容转变成blob地址
        link.href = URL.createObjectURL(blob)
        console.log(link.href)
        link.download = ''
        document.body.appendChild(link)
        link.click()
      })
    })
  }
})

Vue页面中使用指令v-down

<span v-down="item.Url">(附件)</span>

上面的这种方法,也只是将上面的方法略做调整,将地址进行了转化,从而实现对jpg、txt 文件的下载,若有更好的办法请各位大佬指点。

如果实在做导出功能,请求头需要携带token的话,可以参考我的另外一篇文章https://www.jianshu.com/p/b1d5e905714e

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

推荐阅读更多精彩内容

  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,112评论 0 2
  • ## 框架和库的区别?> 框架(framework):一套完整的软件设计架构和**解决方案**。> > 库(lib...
    Rui_bdad阅读 2,979评论 1 4
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,782评论 0 11
  • 序言:乱七八糟一锅粥! 基于Vue.js 教程、介绍— Vue.js 心得: 在vue中,推荐始终使用 kebab...
    苦苦修行阅读 657评论 0 1
  • (一)陆游 蝶恋花·沈园情...
    轻语文阅读 300评论 1 1