Omet navegació

5.3.2 CS-Android: Accés als fitxers

Referència als fitxers

La referència al nostre bucket l'havíem completada en el punt anterior, però la tornem a posar ací per més comoditat.

Per a fer referència als fitxers, podem fer-ho com a fills de l'anterior, o directament a partir de FirebaseStorage:

val mStorageRef = FirebaseStorage.getInstance().reference

val imgRef1 = mStorageRef.child(nom_del_fitxer_1)

val imgRef2 = FirebaseStorage.getInstance().reference.child(nom_del_fitxer_2)

Baixar un fitxer

En Android, per les llibreries que estem utilitzant, serà un poc més llarg que en Eclipse, però amb més "solidesa".

Sobre la referència del fitxer utilitzarem dos possibles mètodes:

  • getFile(), passant-li com a paràmetre un fitxer temporal on es guardarà el fitxer
  • getBytes(), pasant-li com a paràmetre la grandària màxima del buffer per a guardar el fitxer

També tenim la possibilitat de baixar-nos únicament la URL del fitxer, per si no volem baixar-nos el fitxer:

  • downloadUrl

En qualsevol dels tres casos, haurem de muntar un addOnSuccessListener(), que es quedarà escoltant fins que el contingut del fitxer (o la seua URL) estiga disponible. Amb aquesta lectura asíncrona previndrem errades per la tardança en obtenir el resultat.

Així ens quedarà en el nostre exemple, que s'ha d'executar en apretar el botó. Primer veiem com seria en el cas d'utilitzar un fitxer temporal:

        // Amb getFile()
        boto.setOnClickListener {
            val imgRef = mStorageRef.child(nom.text.toString())
            val localFile = File.createTempFile("images", "jpg")
            imgRef.getFile(localFile)
                    .addOnSuccessListener(OnSuccessListener<FileDownloadTask.TaskSnapshot?> {
                        // Successfully downloaded data to local file
                        val bm = BitmapFactory.decodeFile(localFile.getAbsolutePath())
                        imatge.setImageBitmap(bm)
                    }).addOnFailureListener(OnFailureListener {
                        // Handle failed download
                        // ...
                    })
        }

I així queda en el cas d'obtenir el fitxer per mig de getBytes(). S'obtenen en un ByteArray, i en aquest exemple el passem a Bitmap per a carregar la imatge en el ImageView:

        // Amb getBytes()
        boto.setOnClickListener {
            val imgRef = mStorageRef.child(nom.text.toString())
            imgRef.getBytes(500000)
                    .addOnSuccessListener(OnSuccessListener<ByteArray?> {
                        // Successfully downloaded data to local file
                        val bm = BitmapFactory.decodeByteArray(it, 0, it!!.size)
                        imatge.setImageBitmap(bm)
                    }).addOnFailureListener(OnFailureListener {
                        // Handle failed download
                        // ...
                    })
        }


Pujar un fitxer

No ens ho plantegem en aquest exemple, però com abans tindrem més d'un mètode, ara concretament 3:

  • putFile(), per a guardar un fitxer local (com podrien ser fotos del mòbil)
  • putBytes(), si les dades les tenim per exemple en un raw
  • putStream(), per a introduir des d'un InputStream

Obtenir la llista de fitxers

Per a obtenir la llista de fitxers del bucket on estem apuntant podem utilitzar listAll() i sobre ell muntar un addOnSuccessListener()addOnSuccessListener(), que ens assegurarà que quan entrem és perquè s'ha aconseguit la llista i per tant està disponible. Ho farem sobre la referència del bucket

val mStorageRef = FirebaseStorage.getInstance().getReference()
mStorageRef.listAll().addOnSuccessListener {
...
}