參考鏈接:https://blog.csdn.net/weixin_46872121/article/details/135616496
解決辦法一:也是最優解
// mock/index.js import Mock from 'mockjs'; // 使用Mock.js創建一個10條記錄的模擬的數據集 const exportData = Mock.mock({ 'data|10': [{ 'id|+1': 1,//自增 'labelname': '九資' '金額|500-50000': 1, //隨機生成500-50000隨機數 '狀態|0-1': 1 }] }); // 攔截對/api/export的GET請求 Mock.mock('/api/export', 'get', () => { return { status: 200, data: exportData.data }; }); ===使用=== <template> <!-- 導出按鈕 --> <button @click="exportData">導出數據</button> </template> <script> export default { methods: { async exportData() { try { // 發起GET請求以獲取模擬數據 const response = await fetch('/api/export'); const result = await response.json(); // 解析響應為JSON const data = result.data; // 獲取數據部分 //主要是下面這塊代碼,其他都一樣 // 將數據轉換為CSV格式 const csvContent = 'data:text/csv;charset=utf-8,' + data.map(e => Object.values(e).join(",")).join("\n"); // 創建一個隱藏的下載鏈接 const encodedUri = encodeURI(csvContent); const link = document.createElement("a"); link.setAttribute("href", encodedUri); // 設置鏈接的href為CSV數據 link.setAttribute("download", "export_data.csv"); // 設置下載文件名 document.body.appendChild(link); // 將鏈接添加到文檔中 // 程序化點擊下載鏈接以觸發下載 link.click(); document.body.removeChild(link); // 下載完成后移除鏈接 } catch (error) { console.error('導出失敗:', error); // 捕獲并打印錯誤 } } } } </script>
解決辦法二:https://blog.csdn.net/wtd183833501176/article/details/135241930
解決辦法二:但是這種辦法有缺陷,比如服務器自動打包,不用本地的node-modules,還有這個改了所有mock數據就不起作用了 報接口錯誤
項目中有mock又有導出,我之前寫的導出都好好地,后來發現不能用了???太奇怪了,后來排查了好久,發現是mock底層對導出會有攔截,變成亂碼,解決方法:修改mock底層代碼即可: 找到node_modules中的mockjs, 打開mockjs,找到dist, 打開dist,點進mock.js 在mock.js中的八千三百多行有這個代碼: // 原生 XHR if (!this.match) { this.custom.xhr.send(data) return } 把它修改為: // 原生 XHR if (!this.match) { this.custom.xhr.responseType = this.responseType this.custom.xhr.send(data) return } 關閉項目,重新啟動,就可以正常導出了,2023.12.27特此記錄 ———————————————— 版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。 原文鏈接:https://blog.csdn.net/wtd183833501176/article/details/135241930
前言:
本是一個非常簡單的請求,即是下載文件。通常的做法如下:
1.前端通過Vue Axios向后端請求,同時在請求中設置響應體為Blob格式。
2.后端相應前端的請求,同時返回Blob格式的文件給到前端(如果沒有步驟1設置響應體,則后端返回的是一個文件流,前端)
3.前端創建a標簽進行下載
提示:如果后端返回的是文件的地址,那么前端可以直接通過window.location.href加文件路徑即可下載文件。但是如果后臺返回的是文件流,那么前端就需要做一些處理。處理的核心也是將文件流轉成文件,然后使用a標簽模擬點擊下載。

找出問題 && 解決問題
我遇到的問題也是我想寫篇文章記錄一下的原因,因為下載文件這樣的需求我都寫爛了都,覺得這是得心應手的事情,在跟后端對接的時候,我非常堅定是后臺返回流有問題(后面打臉了...)
這里我貼上我下載文件實現代碼:
1.請求API

重點設置: responseType: 'blob'
2.封裝的異步請求

3.調用接口,拿到返回值,模擬超鏈接點擊下載文件

以上步驟似乎感覺是妥妥的了,但是我在自測的時候,一整個人蒙住,文件直接是打不開

然后我看控制臺的輸出,一看,不對勁啊,經過轉換應該返回正常的blob格式才對,卻是如下:
正式因為如此,導致下載下來的是一個無效的文件。
然后開始進一步的排查,代碼都被我看爛了,也沒看出來哪里會不對勁,各種百度也都試了,就是沒有發現有什么問題。最后也是很突然的,我看到有個博主的文章,真的起到醍醐灌頂的作用,文章其中一句“mock模塊會影響原生的ajax請求,使得服務器返回的blob類型變成亂碼”,我才驚愕,因為我在項目中卻是用到了mock,打開控制臺發現,mockjs初始化的時候給攔截響應設置了responseType:'',證據如下:



終于找到原因了,同時把mock注釋掉就可以了。真的是怎么也沒有想到是mock模塊影響了,可是花了好長一段時間去排查這個問題呢,解決了就好呀!!
下面是正常后拿到的數據格式:

優化
tip:我們可以把模擬a標簽下載文件這個邏輯封裝起來,如果后面又下載文件的需求的時候,可以直接拿來用即可。
1.封裝:獲取文件流轉成文件,并模擬點擊該文件,實現下載
???????

2.使用

學學學無止境
關注
————————————————
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
原文鏈接:https://blog.csdn.net/weixin_46872121/article/details/135616496
浙公網安備 33010602011771號