vue.js 使用axios實現下載功能


Ajax無法下載文件的原因

瀏覽器的GET(frame、a)和POST(form)請求具有如下特點:

    response會交由瀏覽器處理
    response內容可以為二進制文件、字符串等

Ajax請求具有如下特點:

    response會交由Javascript處理
    response內容僅可以為字符串

因此,Ajax本身無法觸發瀏覽器的下載功能。
Axios攔截請求並實現下載

為了下載文件,我們通常會采用以下步驟:

    發送請求
    獲得response
    通過response判斷返回是否為文件
    如果是文件則在頁面中插入frame
    利用frame實現瀏覽器的get下載

我們可以為axios添加一個攔截器:

 import axios from 'axios'
     
    // download url
    const downloadUrl = url => {
      let iframe = document.createElement('iframe')
      iframe.style.display = 'none'
      iframe.src = url
      iframe.onload = function () {
        document.body.removeChild(iframe)
      }
      document.body.appendChild(iframe)
    }
     
    // Add a response interceptor
    axios.interceptors.response.use(c=> {
      // 處理excel文件
      if (res.headers && (res.headers['content-type'] === 'application/x-msdownload' || res.headers['content-type'] === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
        downloadUrl(res.request.responseURL)
        
        res.data='';
        res.headers['content-type'] = 'text/json'
        return res;
      }
      ...
      return res;
    }, error => {
      // Do something with response error
      return Promise.reject(error.response.data || error.message)
    })
    export default axios

 res.data='';
    res.headers['content-type'] = 'text/json'
    return res;
  }
  ...
  return res;
}, error => {
  // Do something with response error
  return Promise.reject(error.response.data || error.message)
})
export default axios

 

之后我們就可以通過axios中的get請求下載文件了。

 
結束


 

另一種方法
---------------------

 

由於兼容性等問題,其實導出直接用鏈接更方便一些,兼容性也好,參數不是很多的話放在請求路徑后面也是ok的,具體如下:

    

 //導出
        exportOrderList() {
          this.formItem.token = Cookies.get('token');
          let param = "";
          for(let field in this.formItem) {
            if(this.formItem[field]) {
              param += field + "=" + this.formItem[field] + "&";
            }
          }
          param = param.substring(0, param.length-1);
          let url = "api/queryListExport?" + param;
          window.location.href = url;
        },

關鍵就是這句哦:

window.location.href = url;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM