欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端處理axios請求下載后端返回的文件流代碼實例

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

需求:

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

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

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

2.定義一個下載的方法

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);
    // 點擊下載
    downloadElement.click();
    // 下載完成移除元素
    document.body.removeChild(downloadElement);
    // 釋放掉blob對象
    window.URL.revokeObjectURL(href);
}

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

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

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

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

// 定義一個讀取文件的方法
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.請求成功和失敗的返回結(jié)果是不同

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

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

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

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

// 響應(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;
     }
  }
 ...
}

點擊按鈕下載

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

總結(jié) 

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

相關(guān)文章

  • Vue+Echarts報錯Cannot?set?properties?of?undefined?(setting?‘plate‘)

    Vue+Echarts報錯Cannot?set?properties?of?undefined?(settin

    這篇文章主要介紹了Vue+Echarts報錯Cannot?set?properties?of?undefined?(setting?‘plate‘)的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue調(diào)試工具沒有Pinia模塊的簡單解決辦法

    vue調(diào)試工具沒有Pinia模塊的簡單解決辦法

    Pinia是Vue的存儲庫,它允許您跨組件/頁面共享狀態(tài),這篇文章主要給大家介紹了關(guān)于vue調(diào)試工具沒有Pinia模塊的簡單解決辦法,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • 如何解決vue與傳統(tǒng)jquery插件沖突

    如何解決vue與傳統(tǒng)jquery插件沖突

    本篇文章主要介紹了如何解決vue與傳統(tǒng)jquery插件沖突,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • Vue項目總結(jié)之webpack常規(guī)打包優(yōu)化方案

    Vue項目總結(jié)之webpack常規(guī)打包優(yōu)化方案

    這篇文章主要介紹了vue項目總結(jié)之webpack常規(guī)打包優(yōu)化方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Vue.js中自定義Markdown插件實現(xiàn)References解析(推薦)

    Vue.js中自定義Markdown插件實現(xiàn)References解析(推薦)

    本文主要寫的是,如何編寫一個插件來解析<references>標(biāo)簽,并將其轉(zhuǎn)換為HTML,這種方法可以應(yīng)用于其他自定義標(biāo)簽和功能,為Vue.js應(yīng)用程序中的Markdown渲染提供了極大的靈活性,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • vue中keep-alive組件使用和一些基礎(chǔ)配置方法

    vue中keep-alive組件使用和一些基礎(chǔ)配置方法

    本文主要介紹了Vue中keep-alive組件的使用方法和一些基礎(chǔ)配置,keep-alive是Vue中的一個抽象組件,可以緩存組件實例,提高性能,本文給大家介紹vue中keep-alive組件使用和一些基礎(chǔ)配置方法,感興趣的朋友一起看看吧
    2024-10-10
  • vue實現(xiàn)購物車小案例

    vue實現(xiàn)購物車小案例

    這篇文章主要為大家詳細(xì)介紹了vue實現(xiàn)購物車小案例,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • vue里的data要用return返回的原因淺析

    vue里的data要用return返回的原因淺析

    這篇文章主要介紹了vue里的data要用return返回的原因淺析,需要的朋友可以參考下
    2019-05-05
  • 基于vue hash模式微信分享#號的解決

    基于vue hash模式微信分享#號的解決

    這篇文章主要介紹了基于vue hash模式微信分享#號的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例

    vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例

    這篇文章主要介紹了vue中echarts圖表大小適應(yīng)窗口大小且不需要刷新案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07

最新評論