Probablemente hayas usado Firebase en tus apps para gestionar el envío de notificaciones push, la revisión de estadísticas y Analytics o la revisión de incidencias con crashlytics.

Firebase es la opción de Google para desarrollar apps móviles de forma rápida y sencilla. Pero Firebase no se queda sólo ahí, desde hace unos años ha ido incorporando nuevos servicios dentro de su plataforma, que la convierten en una plataforma imprescindible para todo desarrollador.

A pesar de llevar varios años en funcionamiento, a estos nuevos servicios aún no se les ha sacado todo el rendimiento que ofrecen. Además, abarcan un gran espectro empezando por servicios de autenticación de usuarios (Authentication), pasando por el almacenamiento de datos en la nube (Firestore, Realtime Database, Storage) y acabando por la definición de funciones como si de un backend se tratara (Functions).

Este post forma parte de una serie en la que nos vamos a centrar en los diferentes servicios que nos proporciona Firebase para almacenar datos en la nube. Para ello, lo primero es ver qué herramientas nos ofrece Firebase.

Soluciones de Firebase para almacenar tus datos

Firebase nos proporciona cuatro tipos de soluciones para almacenar nuestros datos en la nube. ¿Cuáles son las funcionalidades que nos brinda cada uno en función de las necesidades de nuestro proyecto?

Cloud Storage

¿Qué es?

Cloud Storage para Firebase almacena tus archivos en un bucket de Google Cloud Storage y los hace accesibles a través de Firebase y Google Cloud. De esta forma, tus usuarios podrán subir y descargar archivos desde tu app.

Las cargas y descargas son robustas, lo que significa que se reinician en el punto en el que se interrumpieron para así ahorrar tiempo y ancho de banda a los usuarios.

Además, puedes realizar procesamiento en el servidor, como filtrado de imágenes o transcodificación de video, con las API de Google Cloud Storage.

En cuanto a la escalabilidad, Cloud Storage se escala automáticamente, por lo que no es necesario migrar a ningún otro proveedor.

Los SDK de Firebase para Cloud Storage se integran perfectamente en Firebase Authentication a fin de identificar a los usuarios. Además, ofrecen un mecanismo de seguridad, de forma que puedas hacer que los archivos sean públicos o privados según lo desees.

¿Para qué sirve?

Cloud Storage te permite almacenar fotos y videos de los propios usuarios de tu app. Con este servicio, tus usuarios podrán subir fotos o videos con tu app y también descargarla. Por ejemplo, podrían almacenar su foto de perfil de usuario.

También te puede permitir, como desarrollador, tener el material que consume tu app en la nube de forma que puedas cambiar/actualizar el aspecto visual de tu app sin tener que subir una nueva versión al store.

¿Cómo usar Cloud Storage en mi app?

NOTA: en este post vamos a mostrar cómo implementarlo en Android, pero también se puede usar en el resto de tecnologías donde la implementación sería muy similar.

Antes de importarlo en tu proyecto, deberás habilitar Cloud Storage dentro de tu proyecto en la consola de Firebase. Para ello, una vez dentro de tu proyecto, deberás entrar en Storage (ubicado en el menú lateral izquierdo) y pulsar en Comenzar.

Como comentaba antes, Firebase incorpora servicios de autenticación, por lo que si quieres modificar la privacidad de tu espacio de almacenamiento, deberás modificar las reglas del mismo.

Nosotros, en este ejemplo vamos a configurarlo público. Para ello, configuraremos esta regla:

match /{allPaths=**} {
      allow read: if true;
      allow write: if true;
}

Con esto ya tenemos listo nuestro espacio de almacenamiento Cloud Storage en nuestro proyecto de Firebase.

Ahora, nos vamos a Android Studio y empezamos a usar Cloud Storage en nuestra app. Lo primero es importar el módulo de firebase a tu fichero build.gradle:

implementation platform('com.google.firebase:firebase-bom:29.1.0')

implementation 'com.google.firebase:firebase-storage'

Si queremos hacer uso de Cloud Storage para subir un fichero, por ejemplo una imagen almacenada en la galería de nuestro móvil, tendríamos que realizar lo siguiente:

// 1 -  Create a storage reference from our app
var storageRef = FirebaseStorage.getInstance().reference

// 2 - Create a child reference
// imagesRef now points to "images"
var imagesRef: StorageReference? = storageRef.child("images")

// 3 - Create the file name
var foodRef = imagesRef.child("food.jpg")

// 4 - Get uri from local file
var file = Uri.fromFile(File("path/to/images/food.jpg"))

// 5 - Upload the file
foodRef.putFile(file)

Ejecutando este código, desde nuestra app subiremos a nuestro Storage una imagen llamada food.jpg almacenada dentro de una subcarpeta llamada images.

Una vez ejecutado este código, si volvemos a la consola de Firebase, podremos ver lo siguiente:

Pero no sólo podemos subir una imagen desde un fichero local. Cloud Storage también nos permite subir una imagen que tengamos cargada en un imageView, lo cual puede ser muy útil e interesante.

Esto es posible porque con Cloud Storage podemos subir una imagen desde datos que tenemos en memoria.

En el siguiente ejemplo, subiremos una imagen que tenemos cargada en un imageView de nuestra aplicación:

// Get the data from an ImageView as bytes
val drinkRef = imagesRef.child("drink.jpg")

imageView.isDrawingCacheEnabled = true
imageView.buildDrawingCache()
val bitmap = (imageView.drawable as BitmapDrawable).bitmap
val baos = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos)
val data = baos.toByteArray()

Al proceso de subida le podemos añadir listener para obtener el resultado:

uploadTask.addOnFailureListener {
    // Handle unsuccessful uploads
}.addOnSuccessListener { taskSnapshot ->
    // Do something...
}

Después de ejecutar este código, nuestra imagen que tenemos cargada en el imageView estará subida a nuestro repositorio de Cloud Storage. Si volvemos a nuestra consola de Firebase, veremos algo así:

Si posteriormente, queremos descargar esa imagen para pintarla en nuestra app dentro de un ImageView:

// 1 - Get the download image url
val uri = storageRef.child("images/food.jpg").downloadUrl.addOnSuccessListener { uri ->
// 2 - Load image into imageView
Glide.with(this /* context */)
        .load(uri)
        .into(imageView)
}.addOnFailureListener {
// Do something..
}

Con esto ya tenemos las bases para empezar a usar Cloud Storage en nuestra app, pero como te puedes imaginar las posibilidades que nos proporciona Cloud Storage son mucho mayores.

En este post hemos querido mostrar cómo empezar a trabajar con esta herramienta de Firebase para romper esa barrera inicial. Sin duda, es un servicio muy potente de Firebase en el que merece la pena profundizar para sacar mayor rendimiento a tu app. No te pierdas nuestro blog y en unos días continuamos con esta serie para analizar las dos bases de datos que tenemos disponibles en Firebase: Cloud Firestore y Realtime Database. En el siguiente post te contamos cómo crear una base de datos y conectarla a nuestra app con Firebase.

Cuéntanos qué te parece.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.

Suscríbete

Estamos comprometidos.

Tecnología, personas e impacto positivo.