- 導出接口,點擊接口是正常調用,請求方式和地址都沒錯。正常情況是直接下載該文檔,但是返回結果是亂碼(如下圖)。
- 解決方法:
– 修改請求配置
– 返回結果接收調整
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();
})
}