前端使用 Ajax/Fetch 下载文件

有时需要发送大量参数或其它需要而必须用到 POST 请求时

原生 XMLHttpRequest

const xhr = new XMLHttpRequest();
xhr.onload = function (e) {
    const blob = new Blob([xhr.response], { type: "application/octet-stream" }); 
    
    // 可以从 Content-Disposition 中获取文件名
    // const contentDisposition = xhr.getResponseHeader("Content-Disposition");

    let link = document.createElement("a");
    let fileName = "xxx.xxx";    
    link.href = window.URL.createObjectURL(blob);
    link.download = fileName;
    link.click();
    link.remove();
    window.URL.revokeObjectURL(link.href);
}
// GET | POST |...
xhr.open(method, url);
// no param | FormData | json string | ...
xhr.send(params);

使用 Fetch

fetch(url, {
  method: "POST",
})
.then(resp => resp.blob())
.then(blob => {
  let link = document.createElement("a");
  link.href = window.URL.createObjectURL(blob);
  link.download = "xxx.xxx";
  link.click();
  link.remove();
  window.URL.revokeObjectURL(link.href);
})

使用 Axios

Axios 是一个基于 promise 网络请求库,在客户端 (浏览端) 中使用 XMLHttpRequests

request({
  url: "",
  method: 'post',
  // 重点
  responseType: 'blob'
}).then((data) => {
  const blob = new Blob([data], { type: 'application/octet-stream' });
  let link = document.createElement('a');
  let fileName = 'xxx.xxx';
  link.href = window.URL.createObjectURL(blob);
  link.download = fileName;
  link.click();
  link.remove();
  window.URL.revokeObjectURL(link.href);
})