Subir Imágenes a Firebase Storage desde un Blog

Clase 23 de 32Curso de Firebase 5 para Web

Resumen

Subir imágenes a Firebase Storage desde un blog es sencillo si dominas la referencia al storage, el control del upload asíncrono y la obtención de la URL de descarga. Aquí verás cómo crear la carpeta por usuario usando su UID, monitorear el porcentaje con bytesTransferred y totalBytes, y guardar el enlace para usarlo al crear el post.

¿Cómo preparar la referencia en Firebase Storage?

Para comenzar, es clave incluir el script de Firebase Storage en el index y luego construir una referencia al directorio donde quedará la imagen. La estructura propuesta crea una carpeta de imágenes del blog y, dentro, una carpeta por UID y el archivo.

  • Adiciona el script de storage al index.
  • Crea la referencia con la ruta de carpetas.
  • Usa el UID del usuario para segmentar archivos.
  • Finaliza con el nombre del archivo.
<!-- Agregar el script de Firebase Storage en index.html -->
<script src=".../firebase-storage.js"></script>
// Recuperar el usuario actual.
const user = firebase.auth().currentUser;
const uid = user.uid; // identificador único del usuario.

// Crear la referencia al directorio y archivo en Storage.
const refStorage = firebase.storage()
  .ref('IMGS post')           // carpeta de imágenes del blog.
  .child(uid)                 // carpeta del usuario.
  .child(file.name);          // nombre del archivo.

Puntos clave: - Firebase crea directorios si no existen al subir un archivo. - La referencia apunta a: carpeta general → carpeta del usuario → archivo. - El método del post recibe el file desde el componente de upload de HTML.

¿Cómo monitorear el progreso y manejar errores del upload?

La subida se ejecuta en background de forma asíncrona. Para observar el proceso, usa la tarea que retorna put(file) y registra eventos con on('state_changed', ...). Con el snapshot puedes calcular el porcentaje y actualizar un control visual tipo barra de progreso.

// Iniciar el upload y obtener la tarea.
const task = refStorage.put(file);

// Observar estados: progreso, error y completado.
task.on('state_changed',
  snapshot => {
    const porcentaje = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    // Actualizar el control visual de "Cargando".
    determinate.style.width = porcentaje + '%';
  },
  error => {
    console.error('Error subiendo el archivo.', error);
    // Informar al usuario el error de subida.
  },
  () => {
    // Al completar, obtener la URL de descarga.
    task.snapshot.ref.getDownloadURL()
      .then(url => {
        console.log('URL de descarga:', url);
        // Guardar la URL en el storage del navegador para usarla al crear el post.
        // (ejemplo) window.localStorage.setItem('urlImagenPost', url);
      })
      .catch(err => {
        console.error('Error obteniendo download URL.', err);
      });
  }
);

Detalles importantes: - bytesTransferred y totalBytes permiten calcular el progreso en porcentaje. - El control visual (por ejemplo, determinate) se actualiza con style.width = porcentaje + '%'. - Maneja el segundo callback para errores de subida. - En el callback final, usa getDownloadURL() para obtener la URL de descarga y guardarla temporalmente en el storage del navegador.

¿Cómo integrar el UID y la URL en el flujo del post?

Desde el controlador, crea una instancia de Post y llama el método que sube la imagen, por ejemplo Subirimagenpost(file). El archivo proviene del componente de upload de HTML. Asegúrate de enviar el UID: si falta, se creará una carpeta con valor no deseado (por ejemplo, undefined). Al corregir y pasar user.uid, todas las imágenes quedarán en la carpeta del usuario.

// En el controlador: recuperar el file del input de HTML y subirlo.
const post = new Post();
post.Subirimagenpost(file); // el método interno usa firebase.auth().currentUser.uid

Buenas prácticas del flujo: - Recupera el usuario actual con firebase.auth().currentUser y usa user.uid al construir la ruta. - Comprueba en el panel de storage que se creen: carpeta general, carpeta por UID y el archivo. - Tras crear el post, usa la URL de descarga guardada para persistirla en la base de datos. - Informa siempre al usuario: progreso, errores y finalización.

¿Te quedó alguna duda sobre state_changed, el cálculo de porcentaje o el manejo de la URL de descarga? Comparte tu pregunta y cuéntame cómo lo estás implementando en tu blog.

      Subir Imágenes a Firebase Storage desde un Blog