最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端處理axios請(qǐng)求下載后端返回的文件流代碼實(shí)例

 更新時(shí)間:2024年07月20日 14:53:53   作者:大力99  
使用axios可以很方便地獲取后端返回的文件流數(shù)據(jù),并在前端直接在瀏覽器下載,這篇文章主要給大家介紹了關(guān)于前端處理axios請(qǐng)求下載后端返回的文件流的相關(guān)資料,需要的朋友可以參考下

需求:

點(diǎn)擊按鈕下載文件,請(qǐng)求后端接口,后端返回文件流,如果遇到錯(cuò)誤信息并不能簡(jiǎn)單的res.message拿到錯(cuò)誤提示,而且想要正常下載前端也需要做些處理。

1.請(qǐng)求接口要加上響應(yīng)類型為blob, responseType: ‘blob’,如:

function logsDownload(params) {
 return axios.get('xxx/xxx/xxx',{
   params,
   responseType: 'blob'
 })
}

2.定義一個(gè)下載的方法

function download(fileName ='log', type: 'txt' | 'json, file:Blob) {
   const blob = new Blob([file]);
    // 獲取heads中的filename文件名
    const downloadElement = document.createElement('a');
    // 創(chuàng)建下載的鏈接
    const href = window.URL.createObjectURL(blob);
    downloadElement.href = href;
    // 下載后文件名
    downloadElement.download = `${fileName}.${type}`
    document.body.appendChild(downloadElement);
    // 點(diǎn)擊下載
    downloadElement.click();
    // 下載完成移除元素
    document.body.removeChild(downloadElement);
    // 釋放掉blob對(duì)象
    window.URL.revokeObjectURL(href);
}

3.借助FileReader對(duì)象實(shí)現(xiàn),F(xiàn)ileReader.readAsText(data)開(kāi)始讀取指定的Blob中的內(nèi)容。

result屬性中將包含一個(gè)字符串以表示所讀取的文件內(nèi)容。

讀取操作完成時(shí)觸發(fā)FileReader.onload(),在這里通過(guò)reader.result拿到讀取的文件內(nèi)容(即后端返回值),然后對(duì)其json序列化,即

可拿到后端返回的message,然后進(jìn)行相應(yīng)的展示即可。

// 定義一個(gè)讀取文件的方法
async function readFileAsText (file:File){
      const fileReader = new FileReader()
      let text
      await new Promise(resolve=>{
         fileReader.onLoad = ()=>{
            text = fileReader.result
            resolve(true)
         }
        fileReader.readAsText(file, 'utf8')
      })
      return text || ''
 }

4.請(qǐng)求成功和失敗的返回結(jié)果是不同

請(qǐng)求下載一個(gè)文件,請(qǐng)求成功時(shí)返回的是一個(gè)文件流,type是對(duì)應(yīng)文件類型,例如:text/xml,正常導(dǎo)出文件; 而請(qǐng)求失敗的時(shí)候返回的是json ,type為application/json,不會(huì)處理錯(cuò)誤信息,而是直接導(dǎo)出包含錯(cuò)誤信息的文件。

但是無(wú)論成功還是失敗,返回的結(jié)果都是blob格式的文件流。

因此可以通過(guò)返回的blob數(shù)據(jù)type類型進(jìn)行區(qū)分,如果type是文件類型,導(dǎo)出文件,如果type是json則把blob數(shù)據(jù)轉(zhuǎn)為string,處理錯(cuò)誤信息。

在響應(yīng)攔截器那里加入以下,需要判斷如果時(shí)文件流直接返回的情況

// 響應(yīng)攔截器
banseInstance.interceptors.response.use(response => {
  ...
  // 文件流直接返回
  if (response .request.responseType === 'blob' ) {
      if (response .data.type === 'application/json') {
        const res = await readFileAsText(response.data)

        ElMessage.error(JSON.parse(res).message || '下載失敗')
        return false;
     } else {
       return response .data;
     }
  }
 ...
}

點(diǎn)擊按鈕下載

  const handleDown = () => {
    const fileName = 'xxxx'
    const file = await logsDownload(params)
    if (file) {
     download(fileName, 'txt', file)
     ElMessage.success('下載成功')
    }
  }

總結(jié) 

到此這篇關(guān)于前端處理axios請(qǐng)求下載后端返回的文件流的文章就介紹到這了,更多相關(guān)axios請(qǐng)求下載后端返回文件流內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue腳手架搭建項(xiàng)目的兼容性配置詳解

    vue腳手架搭建項(xiàng)目的兼容性配置詳解

    這篇文章主要介紹了vue腳手架搭建項(xiàng)目的兼容性配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • vue報(bào)錯(cuò)Failed to execute 'appendChild' on 'Node'解決

    vue報(bào)錯(cuò)Failed to execute 'appendChild&apos

    這篇文章主要為大家介紹了vue報(bào)錯(cuò)Failed to execute 'appendChild' on 'Node'解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • vue實(shí)現(xiàn)微信分享朋友圈,發(fā)送朋友的示例講解

    vue實(shí)現(xiàn)微信分享朋友圈,發(fā)送朋友的示例講解

    下面小編就為大家分享一篇vue實(shí)現(xiàn)微信分享朋友圈,發(fā)送朋友的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • Vue實(shí)現(xiàn)路由傳參的四種方式

    Vue實(shí)現(xiàn)路由傳參的四種方式

    在單頁(yè)應(yīng)用里,路由是連接頁(yè)面與數(shù)據(jù)的橋梁,Vue Router 提供了四種方式把「參數(shù)」從地址欄、內(nèi)存甚至編譯期注入到組件,理解它們的差異,才能在面試和線上故障中游刃有余,下面小編為大家詳細(xì)介紹一下
    2025-09-09
  • vue實(shí)現(xiàn)移動(dòng)端適方案的完整步驟

    vue實(shí)現(xiàn)移動(dòng)端適方案的完整步驟

    現(xiàn)在的手機(jī)五花八門,造就了移動(dòng)端窗口分辨率繁多的局面,在不同分辨率的屏幕下保持與UI圖一致的效果,就成了讓前端不得不頭疼的問(wèn)題,下面這篇文章主要給大家介紹了vue實(shí)現(xiàn)移動(dòng)端適方案的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Vue.js實(shí)現(xiàn)可編輯的表格

    Vue.js實(shí)現(xiàn)可編輯的表格

    這篇文章主要為大家詳細(xì)介紹了Vue.js實(shí)現(xiàn)可編輯的表格,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • vue中如何引入jest單元測(cè)試

    vue中如何引入jest單元測(cè)試

    這篇文章主要介紹了vue中如何引入jest單元測(cè)試問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue中video標(biāo)簽如何實(shí)現(xiàn)不靜音自動(dòng)播放

    Vue中video標(biāo)簽如何實(shí)現(xiàn)不靜音自動(dòng)播放

    最近在做大屏展示需要在一開(kāi)始播放引導(dǎo)視頻,產(chǎn)生自動(dòng)播放需求,下面這篇文章主要給大家介紹了關(guān)于Vue中video標(biāo)簽如何實(shí)現(xiàn)不靜音自動(dòng)播放的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • vue3之聲明式和編程式導(dǎo)航詳解

    vue3之聲明式和編程式導(dǎo)航詳解

    這篇文章主要介紹了vue3之聲明式和編程式導(dǎo)航,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • vue?路由判斷方式

    vue?路由判斷方式

    這篇文章主要介紹了vue?路由判斷方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10

最新評(píng)論

华蓥市| 永登县| 中方县| 都匀市| 益阳市| 黄骅市| 汶上县| 老河口市| 柯坪县| 灵川县| 禹州市| 修文县| 清镇市| 民权县| 武陟县| 青田县| 石台县| 怀来县| 仪陇县| 襄樊市| 峨边| 墨脱县| 延津县| 肇庆市| 夏津县| 永川市| 永城市| 吉木萨尔县| 瓮安县| 巴林左旗| 澳门| 武川县| 抚远县| 长汀县| 岑巩县| 明溪县| 镇宁| 呼和浩特市| 响水县| 浦县| 巩留县|