在前后端分離的 Web 應(yīng)用中,前端往往需要把圖片或其他二進(jìn)制數(shù)據(jù)傳遞到后端,以便進(jìn)行一些處理,而 base64 編碼是一種常用的方式。Base64 是一種將二進(jìn)制數(shù)據(jù)編碼成 ASCII 字符的方法,通常用于在不支持二進(jìn)制數(shù)據(jù)傳輸?shù)膱鼍跋逻M(jìn)行數(shù)據(jù)傳輸。
在前端,我們可以使用 JavaScript 的 atob 和 btoa 方法進(jìn)行 Base64 編解碼。
// 將文件轉(zhuǎn)換為 base64 編碼 function fileToBase64(file) { return new Promise((resolve, reject) =>{ const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = () =>{ const base64Str = reader.result.split(',')[1]; resolve(base64Str); }; reader.onerror = reject; }); } // 將 base64 編碼轉(zhuǎn)換為文件 function base64ToFile(base64Str) { const arr = base64Str.split(','); const mime = arr[0].match(/:(.*?);/)[1]; const bstr = atob(arr[1]); let n = bstr.length; const u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], Math.random().toString(36).slice(-8), { type: mime }); }
在使用 Base64 編碼傳遞數(shù)據(jù)時,我們通常要考慮到傳輸量過大的問題。因為 Base64 編碼會使數(shù)據(jù)的大小增加約三分之一,所以對于大文件或者大規(guī)模數(shù)據(jù)的傳輸,最好對其進(jìn)行壓縮。在 JavaScript 中,我們可以使用 Pako.js 庫進(jìn)行數(shù)據(jù)壓縮。
// 壓縮數(shù)據(jù) function compressData(data) { return pako.gzip(data); } // 解壓數(shù)據(jù) function decompressData(compressedData) { return pako.ungzip(compressedData, { to: 'string' }); }
在前端將數(shù)據(jù)進(jìn)行壓縮后,我們需要將其轉(zhuǎn)換成字符串類型的 JSON 數(shù)據(jù),并通過 AJAX 請求或其他方式傳遞到后端。在后端,我們可以使用相應(yīng)語言提供的 Base64 解碼庫進(jìn)行解碼,然后再進(jìn)行其他操作。
總的來說,Base64 編碼是前端進(jìn)行二進(jìn)制數(shù)據(jù)傳輸?shù)某S梅绞剑⒁獾剿鼤箶?shù)據(jù)量大大增加,需要適時進(jìn)行壓縮。