开发需求中,遇到了说要上传附件,然后在另外一个页面需要点击后端传来的附件url地址实现点击下载,我第一个反应就是a标签的download属性,于是有了下面的代码
<a :href="item.url" :download="item.name" target="_blank" >{{item.name}}</a>
但是,当我点击的时候,发现并没有下载,而是打开了页面,原来是我们服务端和前端的地址部署在不同的服务器:download仅支持同源策略,如果非同源的话,download会失效 且直接跳转到相对应href的界面
那只能另寻出路了,于是我找到了大佬的方法,这边记录一下~ blob方法:
let url ="url";
let name ="百度.docx";
const downloadRes = async () => {
let response = await fetch(url); // 内容转变成blob地址
let blob = await response.blob(); // 创建隐藏的可下载链接
let objectUrl = window.URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = objectUrl;
a.download = name;
a.click()
a.remove();
}
downloadRes();
咱们要做的就是修改几个地方就能用了
HTML:
<div @click="downLoadFile(item)" >{{item.name}}</div>
JS:
downLoadFile(file) {
let url =file.url; //1.修改url
let name =file.name; // 2. 修改name是包含文件格式后缀的,如果没有就要字符串拼接上去,这里决定文件下载的格式
const downloadRes = async () => {
let response = await fetch(url); // 内容转变成blob地址
let blob = await response.blob(); // 创建隐藏的可下载链接
let objectUrl = window.URL.createObjectURL(blob);
let a = document.createElement('a');
a.href = objectUrl;
a.download = name;
a.click()
a.remove();
}
downloadRes();
}
好吧,这里只是踩了个坑,记录下学习到的东西,嘿嘿,至于原理,等有空了再来补充
其他有趣文章的传送门:
- 初识NODE(从常用模块到小型web服务器构建)
- 一篇学会Array原型里的所有方法
- 一篇掌握Object原型里的所有方法
- 初识Vue3,带你认识Vue2和Vue3的区别(一)
- 妈妈说,不会Vue3会被人看不起的(二)
- 奇怪的原型链冷知识(需要有一定原型链的基础才能看哦)
- vue图片放大器,相册集:vue-photo-preview
- 手摸手教你从0用echart写一个响应式页面
- JS实现URL下载
- 手写Promise,完整实现Promise所有功能