[CÓDIGO] Base64 en JavaScript
Ejemplos prácticos de JavaScript para codificación y decodificación Base64 con APIs modernas de navegadores.
// CODIFICACIÓN Y DECODIFICACIÓN BÁSICA
JavaScript proporciona funciones integradas para operaciones Base64. Las funciones btoa() y atob() manejan codificación y decodificación básica:
Estas funciones funcionan perfectamente para texto ASCII, pero requieren manejo especial para caracteres Unicode.
// Codificación Base64 básica
const text = 'Hola Mundo';
const encoded = btoa(text);
console.log(encoded); // SG9sYSBNdW5kbw==
// Decodificación Base64 básica
const decoded = atob(encoded);
console.log(decoded); // Hola Mundo
// Verificar si una cadena es Base64 válido
function isValidBase64(str) {
try {
return btoa(atob(str)) === str;
} catch (err) {
return false;
}
}
// SOPORTE UNICODE
Para cadenas Unicode, necesitamos convertir primero a bytes UTF-8. Los navegadores modernos proporcionan las APIs TextEncoder y TextDecoder:
Este enfoque maneja correctamente emojis, caracteres internacionales y otro contenido Unicode.
// Codificación Base64 segura para Unicode
function encodeBase64(str) {
const encoder = new TextEncoder();
const bytes = encoder.encode(str);
const binary = String.fromCharCode(...bytes);
return btoa(binary);
}
// Decodificación Base64 segura para Unicode
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);
}
// Ejemplo con emoji
const emoji = 'Hola 👋 Mundo 🌍';
const encoded = encodeBase64(emoji);
const decoded = decodeBase64(encoded);
console.log(decoded); // Hola 👋 Mundo 🌍
// MANEJO DE ARCHIVOS
Convertir archivos a Base64 es común para subidas y URIs de datos. Usa la API FileReader para procesamiento de archivos del lado del cliente:
Esto crea URIs de datos que pueden ser incrustados directamente en HTML o enviados a APIs.
// Convertir archivo a URI de datos Base64
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);
});
}
// Uso con input de archivo
document.getElementById('fileInput').addEventListener('change', async (e) => {
const file = e.target.files[0];
if (file) {
try {
const base64 = await fileToBase64(file);
console.log(base64);
// Resultado: data:image/png;base64,iVBORw0KGgoAAAA...
} catch (error) {
console.error('Error:', error);
}
}
});
// BASE64 SEGURO PARA URLS
El Base64 estándar usa caracteres + y / que necesitan codificación URL. El Base64 seguro para URLs reemplaza estos con - y _:
Esto es esencial para tokens, IDs y otros datos transmitidos vía URLs.
// Convertir a Base64 seguro para URLs
function toUrlSafeBase64(base64) {
return base64
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=/g, '');
}
// Convertir desde Base64 seguro para URLs
function fromUrlSafeBase64(urlSafeBase64) {
let base64 = urlSafeBase64
.replace(/-/g, '+')
.replace(/_/g, '/');
// Agregar relleno si es necesario
const padding = 4 - (base64.length % 4);
if (padding !== 4) {
base64 += '='.repeat(padding);
}
return base64;
}
// Ejemplo
const text = 'Prueba de codificación segura para URLs';
const encoded = btoa(text);
const urlSafe = toUrlSafeBase64(encoded);
console.log(urlSafe); // UHJ1ZWJhIGRlIGNvZGlmaWNhY2nDs24gc2VndXJhIHBhcmEgVVJMcw
// STREAMING DE DATOS GRANDES
Para archivos grandes o flujos de datos, procesa en fragmentos para evitar problemas de memoria:
Este enfoque previene el congelamiento del navegador y maneja conjuntos de datos grandes eficientemente.
// Codificación Base64 basada en streaming
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 '';
}
}
// Uso
const encoder = new Base64Encoder();
let result = '';
result += encoder.encode('Primer fragmento');
result += encoder.encode(' Segundo fragmento');
result += encoder.flush();
console.log(result);
// MANEJO DE ERRORES
Siempre implementa manejo apropiado de errores para operaciones Base64:
El manejo robusto de errores previene fallos de aplicación y proporciona mejor experiencia de usuario.
// Operaciones Base64 seguras con manejo de errores
function safeEncode(input) {
try {
if (typeof input !== 'string') {
throw new Error('La entrada debe ser una cadena');
}
return btoa(input);
} catch (error) {
console.error('Error de codificación:', error.message);
return null;
}
}
function safeDecode(base64) {
try {
// Validar formato Base64
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(base64)) {
throw new Error('Formato Base64 inválido');
}
return atob(base64);
} catch (error) {
console.error('Error de decodificación:', error.message);
return null;
}
}
// Uso
const encoded = safeEncode('Hola Mundo');
const decoded = safeDecode(encoded);
if (encoded && decoded) {
console.log('Éxito:', decoded);
}