vue2实现pdf下载而不是浏览器打开(图片...同理)

方法一:

一般我们第一时间肯定是想用a标签加download属性,但它还是会在浏览器中打开,所有找其他方法

思路:使用vue自定义指令,对文件链接进行处理,将链接转化为blob进行下载

第一步:在src下创建download.js

import Vue from "vue";

import axios from 'axios'

Vue.directive('download', {

  inserted: (el, binding) => {

    el.addEventListener('click', () => {

      //获取文件名称

      let name = el.getAttribute('xzname')

      let link = document.createElement('a')

      let url = binding.value

      // 这里是将url转成blob地址,

      axios({

        method:'get',

        url:url,

        responseType:'blob',

      }).then(res=>{

        // 创建隐藏的可下载链接

        const a = document.createElement('a');

        a.style.display = 'none';

        a.href = URL.createObjectURL(res.data);

        // 保存下来的文件名

        a.download = name;

        document.body.appendChild(a);

        a.click();

        // 移除元素

        document.body.removeChild(a);

      })

    })

  }

})

第二步:main.js中进行注册   import './download' 

第三步:<a v-download="url">下载</a>

方法二:

安装依赖:npm i file-saver

注册:import { saveAs as FileSaver } from 'file-saver'

使用:

const oReq = new XMLHttpRequest()

const URL= '文件地址';

oReq.open('GET', URL, true)

oReq.responseType = 'blob'

oReq.onload = function() {

          const file = new Blob([oReq.response], {

            type: 'blob'

    })

FileSaver.saveAs(file, fileName) // fileName为文件名

}

oReq.send()

方法三:

如不想使用vue自定义指令,就简单的一个方法调用,和方法一类似,也是转成blob形式下载

axios({

            method:'get',

            url:url,

            responseType:'blob',

          }).then(res=>{

            // 创建隐藏的可下载链接

            const a = document.createElement('a');

            a.style.display = 'none';

            a.href = URL.createObjectURL(res.data);

            // 保存下来的文件名

            a.download = name;

            document.body.appendChild(a);

            a.click();

            // 移除元素

            document.body.removeChild(a);

          })

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

推荐阅读更多精彩内容