前端请求下载文件的方式

使用 fetch

fetch("//xxx.xxx.com/10.pdf", {
mode: "cors",
})
.then((res) => res.blob())
.then((blob) => {
const blobURL = window.URL.createObjectURL(blob);
const link = document.createElement("a");
link.style.display = "none";
link.href = blobURL;
link.setAttribute("download", decodeURI("10.pdf"));
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
window.URL.revokeObjectURL(blobURL);
});

使用封装好的 $http

$http({
// 防止出现协议问题,这里不要写具体的 http 或者 https
url: "//xxx.xxx.com/10.pdf",
headerType: "download",
method: "get",
// 不指定默认从 content-disposition 头读取,后端接口也必须要设置 content-disposition 才能读取到
fileName: "download.docx",
}).then((res) => {});

window.open

缺点:需要同域、可能会被拦截、浏览器支持预览的文件不会直接下载

window.open("//xxx.xxx.com/10.pdf");

form 表单提交

缺点:浏览器支持预览的文件不会直接下载

export function download(url, params = {}) {
const form = document.createElement("form");
form.method = "post";
form.action = url;
form.target = "_blank";
document.body.appendChild(form);
for (const key in params) {
const value = params[key];
if (value) {
const input = document.createElement("input");
input.setAttribute("type", "hidden");
input.setAttribute("name", key);
if (isArray(value)) {
input.setAttribute("value", stringify(value));
} else {
input.setAttribute("value", value);
}
form.appendChild(input);
}
}
form.submit();
document.body.removeChild(form);
}

a 标签触发

缺点:可能会被拦截、浏览器支持预览的文件不会直接下载

const link = document.createElement("a");
link.style.display = "none";
link.href = "//xxx.xxx.com/10.pdf";
link.setAttribute("download", decodeURI("10.pdf"));
document.body.appendChild(link);
link.click();
document.body.removeChild(link);

1 和 2 的方式,无论什么文件都是执行下载