在uniapp项目开发遇到的下载时a标签download属性失效问题
href属性的地址必须是和你前端js非跨域的地址,如果引用的是第三方的网站或者说是前后端分离的项目,调用后台的接口,这时download就会不起作用,应该用二进制流下载后改名。
下面是错误示例
const link = document.createElement('a');
link.style.display = 'none';
link.href = i.fileUrl;
//因为没有遵守跨域规则所以download属性失效,应该用二进制流下载下来改名
link.setAttribute('download', i.fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
下面是正确的两种方式
uni.request({
url: i.fileUrl,
responseType: 'arraybuffer'
}).then(res => {
const blob = new Blob([res[1].data]); // 通过返回的流数据 手动构建blob 流
//方法1
const a = document.createElement("a");
//blob:localhost
a.download = i.fileName;
a.href = window.URL.createObjectURL(blob);
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
//方法2
// const reader = new FileReader();
// reader.readAsDataURL(blob); // 转换为base64,可以直接放入a标签的href
// reader.onload = (e) => {
// // 转换完成,创建一个a标签用于下载
// const a = document.createElement("a");
// a.download = i.fileName;
// a.href = e.target.result;
// document.body.appendChild(a);
// a.click();
// document.body.removeChild(a);
// }
})