Vue | 實現(xiàn)帶token驗證的文件流下載

之前暑假和團隊一起做了一個仿百度云盤的系統(tǒng)葫盼,涉及到文件的下載,預覽等等叠艳,都不需要攜帶token逆甜。想想其實這種設計是不合理的吁脱。但是當時由于技術水平不高来农,所以只能采取不加控制的文件操作崇猫。但是在新的任務中沪哺,給的接口就是要求headers中攜帶token曼玩,然后后臺返回文件流烘贴,折騰了一番終于80%上實現(xiàn)了這個功能羡儿。

  • 首先講講不需要token驗證的文件下載前端怎么實現(xiàn)
    原理其實非常簡單事示,利用a標簽
<a href="url" download="name"></a>

解釋一下早像,a標簽href里放置文件的地址,這個地址是文件在服務器上存儲的地址肖爵。
假如在服務器端有一個專門的文件服務器卢鹦,那么這個地址就是文件實際上在文件服務器中存儲的地址。
download其實可加可不加劝堪,表示文件的名稱冀自。不加就是文件的默認文件名
當點擊a標簽的時候揉稚,文件的下載過程,轉碼等等操作是由瀏覽器來自主完成的熬粗,瀏覽器能自動檢測文件擴展名來生成對應的文件格式搀玖。

  • 然后講講需要token驗證的文件下載前端怎么做
    首先是有兩種方法的
    第一種,還是使用a標簽驻呐。在請求的正確返回里構造一個a標簽
this.$axios.get('/xxxxx')
      .then(res => {
          var btn = document.createElement("a"); 
          btn .setAttribute('download', '');// download屬性
          btn .setAttribute('href', '');// href鏈接
          abtn click();// 自執(zhí)行點擊事件
})

由此可見巷怜,這種方法的關鍵在于,還是要后臺返回準確的文件地址

第二種的使用情景就是后臺返回的直接是文件流形式暴氏。js在瀏覽器環(huán)境中是不能像其他語言一樣對文件進行操作的(比如C的fread,java的讀取文件操作等等)延塑。
那么由于文件在網(wǎng)絡中傳輸都是以二進制流形式傳輸?shù)模晕覀円柚粋€特殊的對象=>Blob
Blob對象表示一個不可變的, 原始數(shù)據(jù)的類似文件對象答渔,blob對象本質上是js中的一個對象关带,里面可以儲存大量的二進制編碼格式的數(shù)據(jù)。實際上file類也是從blob類繼承來的沼撕。

下面演示一下如何用blob對象接收文件流宋雏。

this.$axios.get('XXXXXXX',{
           responseType:'blob'      //告訴服務器我們需要的響應格式
         })
           .then(res => {
             let blob = new Blob([res.data],{
               type:'application/vnd.ms-excel'      //將會被放入到blob中的數(shù)組內容的MIME類型 
             });
             let objectUrl = URL.createObjectURL(blob);  //生成一個url
             window.location.href = objectUrl;   //瀏覽器打開這個url
           })
           .catch(err => {
             console.log(err);
           })

MIME類型 是設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候务豺,瀏覽器會自動使用指定應用程序來打開

通過以上代碼磨总,我們就可以讓文件流被正確下載啦

最后來說說為什么我認為只實現(xiàn)了80%的期望功能。上述構造Blob對象的方式笼沥,生成的文件名是由Blob對象隨機生成的一段隨機數(shù)蚪燕,并不是期望的文件名。我暫時沒有找到在使用Blob的同時設置指定的文件名奔浅,希望大佬們多多指教

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末馆纳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子汹桦,更是在濱河造成了極大的恐慌鲁驶,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞骆,死亡現(xiàn)場離奇詭異钥弯,居然都是意外死亡,警方通過查閱死者的電腦和手機督禽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門脆霎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赂蠢,你說我怎么就攤上這事绪穆”嬗荆” “怎么了虱岂?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵玖院,是天一觀的道長。 經(jīng)常有香客問我第岖,道長难菌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任蔑滓,我火速辦了婚禮郊酒,結果婚禮上,老公的妹妹穿的比我還像新娘键袱。我一直安慰自己燎窘,他們只是感情好,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布蹄咖。 她就那樣靜靜地躺著褐健,像睡著了一般。 火紅的嫁衣襯著肌膚如雪澜汤。 梳的紋絲不亂的頭發(fā)上蚜迅,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音俊抵,去河邊找鬼谁不。 笑死,一個胖子當著我的面吹牛徽诲,可吹牛的內容都是我干的刹帕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼谎替,長吁一口氣:“原來是場噩夢啊……” “哼轩拨!你這毒婦竟也來了?” 一聲冷哼從身側響起院喜,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亡蓉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后喷舀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體砍濒,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年硫麻,在試婚紗的時候發(fā)現(xiàn)自己被綠了爸邢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡拿愧,死狀恐怖杠河,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤券敌,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布唾戚,位于F島的核電站,受9級特大地震影響待诅,放射性物質發(fā)生泄漏叹坦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一卑雁、第九天 我趴在偏房一處隱蔽的房頂上張望募书。 院中可真熱鬧,春花似錦测蹲、人聲如沸莹捡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽道盏。三九已至,卻和暖如春文捶,著一層夾襖步出監(jiān)牢的瞬間荷逞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工粹排, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留种远,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓顽耳,卻偏偏與公主長得像坠敷,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子射富,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容