最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

前端導(dǎo)出Excel文件出現(xiàn)亂碼或文件損壞問(wèn)題的解決辦法

 更新時(shí)間:2025年09月25日 10:13:24   作者:昭昭是餃子大王  
在現(xiàn)代網(wǎng)頁(yè)應(yīng)用程序中,前端有時(shí)需要與后端進(jìn)行數(shù)據(jù)交互,包括下載文件,這篇文章主要介紹了前端導(dǎo)出Excel文件出現(xiàn)亂碼或文件損壞問(wèn)題的解決辦法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下

1. 檢查后端返回的數(shù)據(jù)格式

  • 確認(rèn)接口響應(yīng):確保后端返回的是二進(jìn)制流(如 ArrayBuffer)或 Base64 編碼的 Excel 文件,而非 JSON 字符串。

    • 用瀏覽器開發(fā)者工具(Network 標(biāo)簽)檢查接口響應(yīng)類型:

      • 正確的 Content-Type 應(yīng)為 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet(xlsx)或 application/vnd.ms-excel(xls)。

      • 響應(yīng)體應(yīng)為二進(jìn)制(非可讀文本)。

2. 前端正確處理二進(jìn)制數(shù)據(jù)

方案 1:直接下載(推薦)

如果后端返回的是文件流,前端無(wú)需手動(dòng)生成文件,直接觸發(fā)下載:

// 假設(shè)使用 axios
axios.get('/api/export', {
  responseType: 'blob', // 關(guān)鍵:指定響應(yīng)類型為 Blob
}).then(response => {
  const url = window.URL.createObjectURL(new Blob([response.data]));
  const link = document.createElement('a');
  link.href = url;
  link.setAttribute('download', 'data.xlsx');
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
});

方案 2:手動(dòng)構(gòu)造 Blob

如果后端返回的是 Base64 編碼:

const base64Data = '后端返回的Base64字符串';
const byteCharacters = atob(base64Data);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
  byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });

// 觸發(fā)下載(同方案1)

3. 編碼問(wèn)題處理

亂碼的可能原因

  • 響應(yīng)頭缺失:后端未設(shè)置 Content-Disposition 或 Content-Type。

  • 前端未正確解碼:如 Base64 解碼錯(cuò)誤或字符集不匹配。

解決方案

強(qiáng)制設(shè)置編碼(適用于亂碼):

const blob = new Blob([response.data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' });

檢查文件名編碼:如果文件名亂碼,后端需在 Content-Disposition 中編碼文件名:

Content-Disposition: attachment; filename*=UTF-8''%E6%95%B0%E6%8D%AE.xlsx

4. 常見錯(cuò)誤排查

問(wèn)題現(xiàn)象可能原因解決方案
文件損壞,無(wú)法打開Blob 類型錯(cuò)誤或數(shù)據(jù)截?cái)?/td>檢查 responseType: 'blob' 和響應(yīng)數(shù)據(jù)完整性
文件名亂碼響應(yīng)頭未編碼文件名后端設(shè)置 filename*=UTF-8''xxx
瀏覽器直接顯示亂碼文本未正確識(shí)別為二進(jìn)制流確保 Content-Type 和 responseType 匹配
文件內(nèi)容為 JSON 文本后端實(shí)際返回了 JSON 數(shù)據(jù)檢查接口邏輯,確保返回文件流

5. 測(cè)試工具驗(yàn)證

  • 使用 Postman 或 Curl 直接請(qǐng)求接口
    確認(rèn)下載的文件是否正常。如果后端返回的文件本身有問(wèn)題,需優(yōu)先修復(fù)后端。

  • 對(duì)比前后端文件
    用二進(jìn)制工具(如 Hex Editor)比較前后端生成的文件,確認(rèn)是否一致。

6. 終極備用方案

如果以上方法無(wú)效,嘗試純前端生成 Excel(適用于數(shù)據(jù)量小的場(chǎng)景)

import * as XLSX from 'xlsx'; // 使用 sheetjs 庫(kù)

const data = [[“姓名”, “年齡”], [“張三”, 25]];
const ws = XLSX.utils.aoa_to_sheet(data);
const wb = XLSX.utils.book_new();
XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
XLSX.writeFile(wb, "export.xlsx");

總結(jié)步驟

  1. 確認(rèn)后端返回的是二進(jìn)制流(非 JSON)。

  2. 前端指定 responseType: 'blob'。

  3. 正確構(gòu)造 Blob 并設(shè)置 MIME 類型。

  4. 檢查響應(yīng)頭編碼和文件名

  5. 如仍失敗,換用純前端庫(kù)生成 Excel 或聯(lián)調(diào)后端修復(fù)數(shù)據(jù)源。

到此這篇關(guān)于前端導(dǎo)出Excel文件出現(xiàn)亂碼或文件損壞問(wèn)題的解決辦法的文章就介紹到這了,更多相關(guān)前端導(dǎo)出Excel文件亂碼或文件損壞內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JS模擬實(shí)現(xiàn)方法重載示例

    JS模擬實(shí)現(xiàn)方法重載示例

    這篇文章主要介紹了JS模擬實(shí)現(xiàn)方法重載,涉及js基于arguments實(shí)現(xiàn)重載的相關(guān)技巧,需要的朋友可以參考下
    2016-08-08
  • js使用for循環(huán)與innerHTML獲取選中tr下td值

    js使用for循環(huán)與innerHTML獲取選中tr下td值

    這篇文章主要與大家分享了js使用for循環(huán)與innerHTML獲取選中tr下td值的方法,很簡(jiǎn)單,但很實(shí)用,有需要的朋友可以參考下
    2014-09-09
  • JS原生瀑布流效果實(shí)現(xiàn)

    JS原生瀑布流效果實(shí)現(xiàn)

    這篇文章主要介紹了JS原生瀑布流效果實(shí)現(xiàn) ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 前端實(shí)現(xiàn)批量下載并打包成ZIP文件的步驟及示例

    前端實(shí)現(xiàn)批量下載并打包成ZIP文件的步驟及示例

    下載我相信很多小伙伴并不陌生,下載文件的形式也有很多,下面這篇文章主要給大家介紹了關(guān)于前端實(shí)現(xiàn)批量下載并打包成ZIP文件的步驟及示例,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • js 一個(gè)關(guān)于圖片onload加載的事

    js 一個(gè)關(guān)于圖片onload加載的事

    前幾天一個(gè)項(xiàng)目讓我頭疼了很久,一個(gè)關(guān)于圖片加載時(shí)的loading效果,因?yàn)椴皇翘甹s,所以在網(wǎng)上各種找資料,但還是不理想,無(wú)賴苦心研究,終于有了一點(diǎn)眉目了,雖然個(gè)中還有一些道理不懂,至少目的達(dá)到了
    2013-11-11
  • js實(shí)現(xiàn)文本框中焦點(diǎn)在最后位置

    js實(shí)現(xiàn)文本框中焦點(diǎn)在最后位置

    本篇文章主要是對(duì)js實(shí)現(xiàn)文本框中焦點(diǎn)在最后位置的示例代碼進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所 幫助
    2014-03-03
  • 將查詢條件的input、select清空

    將查詢條件的input、select清空

    查詢條件清空將input、select的值清空,下面有個(gè)不錯(cuò)的示例,需要的朋友可以了解下
    2014-01-01
  • 詳解Javascript中prototype屬性(推薦)

    詳解Javascript中prototype屬性(推薦)

    這篇文章主要介紹了Javascript中prototype屬性的相關(guān)資料,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧
    2016-09-09
  • checkbox全選所涉及到的知識(shí)點(diǎn)介紹

    checkbox全選所涉及到的知識(shí)點(diǎn)介紹

    checkbox全選涉及到的知識(shí)點(diǎn)比如IE里起作用,火狐不起作用,getElementById()與getElementsByName()的區(qū)別等等
    2013-12-12
  • 淺談Javascript中substr和substring的區(qū)別

    淺談Javascript中substr和substring的區(qū)別

    這篇文章主要介紹了Javascript中substr和substring的區(qū)別,非常的簡(jiǎn)單明了,有需要的小伙伴可以來(lái)仔細(xì)看看。
    2015-09-09

最新評(píng)論

延安市| 黄大仙区| 吴旗县| 麻城市| 罗田县| 峡江县| 醴陵市| 西和县| 盐城市| 根河市| 大方县| 肥城市| 工布江达县| 冕宁县| 沙雅县| 清苑县| 日喀则市| 红桥区| 区。| 彩票| 文水县| 武平县| 十堰市| 京山县| 临西县| 宜宾市| 和硕县| 合阳县| 黎川县| 察雅县| 博白县| 荣成市| 石阡县| 朝阳区| 靖西县| 湖州市| 栾城县| 绿春县| 彭阳县| 卢龙县| 浦北县|