JavaScript: декодирование строки в Base64
Вообще штатно есть функции для кодирования/декодирования: atob / btoa. Но один нюанс: если строчку вида «Hello world!» они кодирую-декодируют легко, то с бинарными файлами выйдет ой. Не, они конечно тоже что-то сделают, но с «тихой ошибкой» — т.е. результат будет, но не верен. Попался так, когда с сервера передавал файл в base64 на клиент javascript, декодировал его примерно так:
1 2 3 4 5 |
let a = document.createElement("a"); let file = new Blob([atob(data.result)], {type: 'application/xlsx'}); a.href = URL.createObjectURL(file); a.download = "template_0.xlsx"; a.click(); |
А в результате, с виду вроде бы валидный файл, экселем открываться отказался. А всё потому, что atob не работает со строками в Uicode. Потому обычно используют следующие обертки для кодирования-декодирования:
1 2 3 4 5 6 7 8 |
function base64ToBytes(base64) { const binString = atob(base64); return Uint8Array.from(binString, (m) => m.codePointAt(0)); } function bytesToBase64(bytes) { const binString = String.fromCodePoint(...bytes); return btoa(binString); } |