后端api接口直接返回文件路径
//res为后台传过来的文件路径
var a = document.createElement("a"); //创建一个<a></ a>标签
a.href = res; // 将流文件写入a标签的href属性值
a.download = "xxx.docx"; //设置文件名
a.style.display = "none"; // 障眼法藏起来a标签
document.body.appendChild(a); // 将a标签追加到文档对象中
a.click(); // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了
a.remove(); // 一次性的,用完就删除a标签
后端api接口返回文件流
//res为后端返回的文件流
const blob = new Blob([res]); // 把得到的结果用blob对象转一下
var a = document.createElement("a"); //创建一个<a></ a>标签
a.href = URL.createObjectURL(blob); // 将流文件写入a标签的href属性值
a.download = "xxx.docx"; //设置文件名
a.style.display = "none"; // 障眼法藏起来a标签
document.body.appendChild(a); // 将a标签追加到文档对象中
a.click(); // 模拟点击了a标签,会触发a标签的href的读取,浏览器就会自动下载了
a.remove(); // 一次性的,用完就删除a标签
同样的 需要在接口请求加上
responseType = "blob";
不然的话接口返回的文件流不会自动转成blob对象返回到res中
在第一种情况也就是后台直接返回一个文件路径的时候,上了生产环境之后会跳转到一个空白页,url末尾有#blocked,链接单独访问是正常的 最后搜寻大量资料是发现被浏览器ban掉了,具体原因是不知道哪个策略,但只需要加上一个属性rel="noopener noreferrer",上线后即可。也可以和后端协调,尽量使用文件流进行传输。
a.rel = "noopener noreferrer"