方法一:
一般我们第一时间肯定是想用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);
? ? ? ? ? })