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 --><scriptsrc=".../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 =newPost();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.
y en ConfigFirebase.js agregue el storageBucket que te lo proporciona el panel de firebase una vez activando el storage
Yo hice un componente de react para el progress bar
importReactfrom'react'exportdefaultfunctionImgProgressBar(props){return(<div><div className="bg-blue-700 text-white flex" style={{width:!props.progress?"0%":`${props.progress}%`}}><span>Porcentaje de subida:</span><span>{!props.progress?"0%": props.progress}</span></div></div>)}
sin embargo, el progress bar se va al 100% de golpe...no se si es porque se sube muy rapido (aunque me causa ruido). Si es un bug mio, porfa ayudenme con la solucion :)
Si sale un mensaje de error con el mensaje "firebase.storage is undefined" solo es cuestion de escribir bien el cdn o sdk asi que dejare el script para que todo funcione con normal
Hola, luego de ver el video de subir archivos a firebase quisiera saber que es mejor entre subir un archivo a firebase o convertir el archivo base 64 y colocarlo como un campo de un documento?
En mi caso tenia un sistema que utilizaba fotos de los perfiles de los trabajadores y este subía dichas en base64 para mayor facilidad al programar el sistema en primera instancia pero después nos topamos con el problema de que dichas imágenes las necesitábamos para otro programa que generaba las firmas de email pero como lo que nos traía era el texto en base64 la firma quedaba muy pesada y el gestor de correo no dejaba subir la firma.
En resumen es mejor tener la imagen subida y no la base64 aunque eso depende de la flexibilidad y expansión que pueda tener tu proyecto.
Hola, sucede que mis posts se crean y mi archivo (imagen en este caso) se sube a el storage de firebase, pero en el thumbnail del post no se muestra la imagen, en la consola solamente me dice esto.
post.js:41 Uncaught TypeError: Cannot read property 'toDate' of null
at post.js:41
at database.ts:1993
at document_set.ts:97
at o.inorderTraversal (sorted_map.ts:319)
at o.inorderTraversal (sorted_map.ts:320)
at n.inorderTraversal (sorted_map.ts:136)
at o.forEach (document_set.ts:96)
at e.forEach (database.ts:1992)
at Object.next (post.js:34)
at next (database.ts:1819)
at async_observer.ts:51
@firebase/firestore: Firestore (6.4.0):
The timestampsInSnapshots setting now defaults to true and you no
longer need to explicitly set it. In a future release, the setting
will be removed entirely and so it is recommended that you remove it
from your firestore.settings() call now.
¡Hola! Eso quiere decir que necesitas borrar la configuración de timestampsInSnapshots que creaste en el archivo de configuración de Firebase ya que lo trae por defecto en las nuevas versiones
Es un problema de seguridad cruzada al insertar direcciones de otro lado
hay que cambiar el watch?v= por embed
Y ahi ya se puede visualizar el video
Hola a todos por ver esta publicación.
Quien me hacer el favor de decirme como se hace para que mi archivo enviando al hosting no solo se vea en una sola ruta del proyecto, es decir que de la sección principal se vea también en mi actividad personal, en pocas palabras estén conectadas.
Gracias
Hola!
No logro entender bien cuál es el resultado que buscas, me podrías regalar más contexto, por favor?
Tengo el código igual pero cuándo intento subir la imagen me manda el siguiente error:
An unknown error occurred, please check the error payload for server response. (storage/unknown)
¿Saben que podría ser?
mmm no
Ademas de imagenes, videos, que otras cosas se podrain guardar en el storage?, Por que si nombre, correos electronicos e informacion de los users eso se guardaria en la base de datos no?
Cuando subo imagenes con el mismo nombre, se sobreescriben. Como soluciono eso?
Quizás tengas que hacer unas líneas de código para identificar si ya existe el mismo nombre y en caso sea así enviar a Firebase con el nombre modificado.
O quizás de antemano, antes de cargar la imagen a Firebase generar un nombre tipo hash que no se vuelva a repetir.
La segunda opción que te indica @israelyance en mi opinión es la mejor, pues le ahorra una consulta al servidor.
Es basicamente el método que emplea por ejmplo platzi. (espera al final y fijate en lo que ocurre en el nombre del achivo al subir la imagen.)
!Imgur
Hola a todos por ver esta publicación.
Quien me hacer el favor de decirme como se hace para que mi archivo enviando al hosting no solo se vea en una sola ruta del proyecto, es decir que de la sección principal se vea también en mi actividad personal, en pocas palabras estén conectadas.
Gracias a todos
Link actualizado firebase storage
No se encuentra en los primeros pasos de firebase , en todo caso guiarse de los que se encuentra y solo cambiar la ultima parte por firebase-storage.js
Es genial que firebase te de esl status de la carga del archivo, esto siempre el útil para archivos pesados:D!
Existe alguna forma de aplicar transacción a estas activades?.
Es decir, revertir la tarea de registro o subida si algunas de estas no se lleva a cabo correctamente
Que pasa si al final el usuario cancela la creación del post o no queria subir esa imagen, estariamos almacenando la imagen que no seria util/necesaria
Una opción es no hacer la subida hasta que el post no sea creado, adicionalmente cuando un blog se borre revisar la o las imágenes asociadas y borrarlas del sistema de archivos.
no entiendo el sessionStorage para que se usa? y no entiendo como lo usa para guardar la url a la bd?
Es verdad al parecer no lo usa solo lo setea
Lo que sucede es que: el guarda la url en el sessionStorage para que cuando el componente post sea renderizado, lea los session storage y sea el quien envia para la base de datos.
El podria hacer eso directamente en ese codigo, pero decidio dejarle ese trabajo a otro componente.
se pueden subir vídeos del ordenador en el blog?
Creería que no es lo mas recomendable por la limitante de espacio que ofrece firebase-
Sensacional Profesor, siempre quise saber como se hacia esto