使用axios,導出文件時,接口正常,返回亂碼問題修復

  • 導出接口,點擊接口是正常調用,請求方式和地址都沒錯。正常情況是直接下載該文檔,但是返回結果是亂碼(如下圖)。
    在這裏插入圖片描述
  • 解決方法:
    – 修改請求配置
    – 返回結果接收調整
import axios from 'axios';
import { getToken } from '@/utils/utils';
export function exportFile(url, params) {
	// 使用的是element-ui框架,添加loading
  let loadingInstance = Loading.service({ fullscreen: false, text: '加載中...' });
  axios({
    method: 'post',
    url: process.env.VUE_APP_BASE_API + url,
    data: params,
    headers: {
      token: getToken(),
    },
    responseType: 'arraybuffer', // 代表內存之中的一段二進制數據 必須加
  }).then(res => {
  	// 從返回的headers中拿到文件名稱
    let filename = decodeURIComponent(res.headers['content-disposition'].split(';')[1].split('=')[1]).replace(/\"/g, '');
    
    // 使用Blob對象
    let blob = new Blob([res.data], { type: 'application/vnd' });
    //  URL.createObjectURL()方法會根據傳入的參數創建一個指向該參數對象的URL. 這個URL的生命僅存在於它被創建的這個文檔裏. 新的對象URL指向執行的File對象或者是Blob對象.
    var blobURL = window.URL.createObjectURL(blob)
    
    // 創建a標籤,調用其點擊事件,模擬點擊下載
    var tempLink = document.createElement('a')
    tempLink.style.display = 'none'
    tempLink.href = blobURL
    tempLink.setAttribute('download', filename)
    if (typeof tempLink.download === 'undefined') {
      tempLink.setAttribute('target', '_blank')
    }
    document.body.appendChild(tempLink)
    tempLink.click()
    
    // 下載完畢移除a標籤,移除url對象
    document.body.removeChild(tempLink)

	// 釋放URL對象
    window.URL.revokeObjectURL(blobURL)
	
	// 關閉loading效果
    loadingInstance.close();
  })
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章