前端接受後端文件流並下載的幾種方法

開篇一張圖

前言

項目中常常會遇到須要導出列表內容,或者下載文件之類的需求。結合各類狀況,我總結了前端最經常使用的三種方法來接受後端傳過來的文件流並下載,針對不一樣的狀況可使用不一樣的方法。前端

方法一

使用場景

針對後端的get請求ios

具體實現

<a href="後端文件下載接口地址" >下載文件</a>

直接用個<a>標籤來接受後端的文件流json

方法二

使用場景

針對後端的post請求
利用原生的XMLHttpRequest方法實現axios

具體實現

function request () {
    const req = new XMLHttpRequest();
    req.open('POST', '<接口地址>', true);
    req.responseType = 'blob';
    req.setRequestHeader('Content-Type', 'application/json');
    req.onload = function() {
      const data = req.response;
      const a = document.createElement('a');
      const blob = new Blob([data]);
      const blobUrl = window.URL.createObjectURL(blob);
      download(blobUrl) ;
    };
    req.send('<請求參數:json字符串>');
  };

function download(blobUrl) {
  const a = document.createElement('a');
  a.style.display = 'none';
  a.download = '<文件名>';
  a.href = blobUrl;
  a.click();
  document.body.removeChild(a);
}

request();

方法三

使用場景

針對後端的post請求
利用原生的fetch方法實現後端

具體實現

function request() {
  fetch('<接口地址>', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: '<請求參數:json字符串>',
  })
    .then(res => res.blob())
    .then(data => {
      let blobUrl = window.URL.createObjectURL(data);
      download(blobUrl);
    });
}

function download(blobUrl) {
  const a = document.createElement('a');
  a.style.display = 'none';
  a.download = '<文件名>';
  a.href = blobUrl;
  a.click();
  document.body.removeChild(a);
}

request();

總結

  • 若是後端提供的下載接口是get類型,能夠直接使用方法一,簡單又便捷;固然若是想使用方法2、三也是能夠的,不過感受有點捨近求遠了。
  • 若是後端提供的下載接口是post類型,就必需要用方法二或者方法三了。

方法二和方法三怎麼取捨?

  • 當你的項目裏的接口請求全是基於XMLHttpRequest實現的,這時方法二就更加適合,只要基於你原來項目中的接口請求工具類加以擴展就好了。
  • 當你的項目裏的接口請求全是基於fetch實現的,這時方法三就更加適合,好比我如今的作的一個項目就是基於ant design pro的後臺管理系統,它裏面的請求類就是基於fetch的,因此我就直接用的方法三,只要在它的request.js文件中稍做修改就行。
  • 我這裏討論的是兩種原生的請求方式,若是你項目中引用了第三方請求包來發送請求,好比axios之類的,那就要另當別論了。
相關文章
相關標籤/搜索