[КОД] Base64 в JavaScript
Практические примеры JavaScript для кодирования и декодирования Base64 с современными API браузеров.
// БАЗОВОЕ КОДИРОВАНИЕ И ДЕКОДИРОВАНИЕ
JavaScript предоставляет встроенные функции для операций Base64. Функции btoa() и atob() обрабатывают базовое кодирование и декодирование:
Эти функции отлично работают для ASCII текста, но требуют специальной обработки для Unicode символов.
// Базовое кодирование Base64
const text = 'Привет Мир';
const encoded = btoa(text);
console.log(encoded); // 0J/RgNC40LLQtdGCINCc0LjRgA==
// Базовое декодирование Base64
const decoded = atob(encoded);
console.log(decoded); // Привет Мир
// Проверка валидности Base64 строки
function isValidBase64(str) {
try {
return btoa(atob(str)) === str;
} catch (err) {
return false;
}
}
// ПОДДЕРЖКА UNICODE
Для Unicode строк нужно сначала конвертировать в UTF-8 байты. Современные браузеры предоставляют TextEncoder и TextDecoder API:
Этот подход корректно обрабатывает эмодзи, международные символы и другой Unicode контент.
// Unicode-безопасное кодирование Base64
function encodeBase64(str) {
const encoder = new TextEncoder();
const bytes = encoder.encode(str);
const binary = String.fromCharCode(...bytes);
return btoa(binary);
}
// Unicode-безопасное декодирование Base64
function decodeBase64(base64) {
const binary = atob(base64);
const bytes = new Uint8Array(binary.length);
for (let i = 0; i < binary.length; i++) {
bytes[i] = binary.charCodeAt(i);
}
const decoder = new TextDecoder();
return decoder.decode(bytes);
}
// Пример с эмодзи
const emoji = 'Привет 👋 Мир 🌍';
const encoded = encodeBase64(emoji);
const decoded = decodeBase64(encoded);
console.log(decoded); // Привет 👋 Мир 🌍
// РАБОТА С ФАЙЛАМИ
Конвертация файлов в Base64 распространена для загрузок и data URI. Используйте FileReader API для обработки файлов на стороне клиента:
Это создает data URI, которые могут быть встроены непосредственно в HTML или отправлены в API.
// Конвертация файла в Base64 data URI
function fileToBase64(file) {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
reader.readAsDataURL(file);
});
}
// Использование с input файла
document.getElementById('fileInput').addEventListener('change', async (e) => {
const file = e.target.files[0];
if (file) {
try {
const base64 = await fileToBase64(file);
console.log(base64);
// Результат: data:image/png;base64,iVBORw0KGgoAAAA...
} catch (error) {
console.error('Ошибка:', error);
}
}
});
// URL-БЕЗОПАСНЫЙ BASE64
Стандартный Base64 использует символы + и /, которые нуждаются в URL кодировании. URL-безопасный Base64 заменяет их на - и _:
Это необходимо для токенов, ID и других данных, передаваемых через URL.
// Конвертация в URL-безопасный Base64
function toUrlSafeBase64(base64) {
return base64
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
// Конвертация из URL-безопасного Base64
function fromUrlSafeBase64(urlSafeBase64) {
let base64 = urlSafeBase64
.replace(/-/g, '+')
.replace(/_/g, '/');
// Добавить padding при необходимости
const padding = 4 - (base64.length % 4);
if (padding !== 4) {
base64 += '='.repeat(padding);
}
return base64;
}
// Пример
const text = 'Тест URL-безопасного кодирования';
const encoded = btoa(text);
const urlSafe = toUrlSafeBase64(encoded);
console.log(urlSafe); // 0KLQtdGB0YIgVVJMLdCx0LXQt9C-0L_QsNGB0L3QvtCz0L4g0LrQvtC00LjRgNC-0LLQsNC90LjRjw
// ПОТОКОВАЯ ОБРАБОТКА БОЛЬШИХ ДАННЫХ
Для больших файлов или потоков данных обрабатывайте по частям, чтобы избежать проблем с памятью:
Этот подход предотвращает зависание браузера и эффективно обрабатывает большие наборы данных.
// Потоковое кодирование Base64
class Base64Encoder {
constructor() {
this.buffer = '';
}
encode(chunk) {
this.buffer += chunk;
const completeBytes = Math.floor(this.buffer.length / 3) * 3;
const toEncode = this.buffer.slice(0, completeBytes);
this.buffer = this.buffer.slice(completeBytes);
return btoa(toEncode);
}
flush() {
if (this.buffer.length > 0) {
const result = btoa(this.buffer);
this.buffer = '';
return result;
}
return '';
}
}
// Использование
const encoder = new Base64Encoder();
let result = '';
result += encoder.encode('Первая часть');
result += encoder.encode(' Вторая часть');
result += encoder.flush();
console.log(result);
// ОБРАБОТКА ОШИБОК
Всегда реализуйте правильную обработку ошибок для операций Base64:
Надежная обработка ошибок предотвращает сбои приложения и обеспечивает лучший пользовательский опыт.
// Безопасные операции Base64 с обработкой ошибок
function safeEncode(input) {
try {
if (typeof input !== 'string') {
throw new Error('Входные данные должны быть строкой');
}
return btoa(input);
} catch (error) {
console.error('Ошибка кодирования:', error.message);
return null;
}
}
function safeDecode(base64) {
try {
// Валидация формата Base64
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(base64)) {
throw new Error('Неверный формат Base64');
}
return atob(base64);
} catch (error) {
console.error('Ошибка декодирования:', error.message);
return null;
}
}
// Использование
const encoded = safeEncode('Привет Мир');
const decoded = safeDecode(encoded);
if (encoded && decoded) {
console.log('Успех:', decoded);
}