前端接受后端文件流并下載的幾種方法

開篇一張圖

前言

項目中經(jīng)常會遇到需要導出列表內(nèi)容玛痊,或者下載文件之類的需求。結(jié)合各種情況迎膜,我總結(jié)了前端最常用的三種方法來接受后端傳過來的文件流并下載,針對不同的情況可以使用不同的方法神妹。

方法一

使用場景

針對后端的get請求

具體實現(xiàn)

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

直接用個<a>標簽來接受后端的文件流

方法二

使用場景

針對后端的post請求
利用原生的XMLHttpRequest方法實現(xiàn)

具體實現(xiàn)

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('<請求參數(shù):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方法實現(xiàn)

具體實現(xiàn)

function request() {
  fetch('<接口地址>', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    body: '<請求參數(shù):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();

總結(jié)

  • 如果后端提供的下載接口是get類型颓哮,可以直接使用方法一,簡單又便捷鸵荠;當然如果想使用方法二题翻、三也是可以的,不過感覺有點舍近求遠了腰鬼。
  • 如果后端提供的下載接口是post類型嵌赠,就必須要用方法二或者方法三了。

方法二和方法三怎么取舍熄赡?

  • 當你的項目里的接口請求全是基于XMLHttpRequest實現(xiàn)的姜挺,這時方法二就更加適合,只要基于你原來項目中的接口請求工具類加以擴展就行了彼硫。
  • 當你的項目里的接口請求全是基于fetch實現(xiàn)的炊豪,這時方法三就更加適合,比如我現(xiàn)在的做的一個項目就是基于ant design pro的后臺管理系統(tǒng)拧篮,它里面的請求類就是基于fetch的词渤,所以我就直接用的方法三,只要在它的request.js文件中稍作修改就行串绩。
  • 我這里討論的是兩種原生的請求方式缺虐,如果你項目中引用了第三方請求包來發(fā)送請求,比如axios之類的礁凡,那就要另當別論了高氮。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市顷牌,隨后出現(xiàn)的幾起案子剪芍,更是在濱河造成了極大的恐慌,老刑警劉巖窟蓝,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罪裹,死亡現(xiàn)場離奇詭異,居然都是意外死亡运挫,警方通過查閱死者的電腦和手機状共,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滑臊,“玉大人口芍,你說我怎么就攤上這事箍铲」途恚” “怎么了淑掌?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵丑勤,是天一觀的道長。 經(jīng)常有香客問我,道長钮呀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任锹锰,我火速辦了婚禮拳亿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘调榄。我一直安慰自己踊赠,他們只是感情好,可當我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布每庆。 她就那樣靜靜地躺著筐带,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缤灵。 梳的紋絲不亂的頭發(fā)上伦籍,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天,我揣著相機與錄音腮出,去河邊找鬼帖鸦。 笑死,一個胖子當著我的面吹牛胚嘲,可吹牛的內(nèi)容都是我干的作儿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼馋劈,長吁一口氣:“原來是場噩夢啊……” “哼立倍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侣滩,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤口注,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后君珠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寝志,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年策添,在試婚紗的時候發(fā)現(xiàn)自己被綠了材部。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡唯竹,死狀恐怖乐导,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浸颓,我是刑警寧澤物臂,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布旺拉,位于F島的核電站,受9級特大地震影響棵磷,放射性物質(zhì)發(fā)生泄漏蛾狗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一仪媒、第九天 我趴在偏房一處隱蔽的房頂上張望沉桌。 院中可真熱鬧,春花似錦算吩、人聲如沸留凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冰抢。三九已至,卻和暖如春艘狭,著一層夾襖步出監(jiān)牢的瞬間挎扰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工巢音, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遵倦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓官撼,卻偏偏與公主長得像梧躺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子傲绣,可洞房花燭夜當晚...
    茶點故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容