JavascriptProva

venerdì 2 settembre 2016

Download di un file immagine dallo Storage in forma di array di bytes

Mi viene in mente l'ovvia domanda: e per il download?

C'è un apposito capitolo...

Creiamo, ovviamente, sempre il riferimento. Lo rifaccio a titolo di esercizio.
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageReference = storage.getReference("gs://jaccaprogetto.appspot.com");
Questo è il riferimento allo storage per intero.
Ora io ho un'immagine nella cartella "cazzate".
Quindi faccio un riferimento alla cartella stessa.
Primo errore già fatto, ecco la correzione:
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
Bene.
Mi porto sulla cartella che voglio:
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
        StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg");
Ecco, la prima modalità che mi viene presentata è proprio l'inverso di quello che ho fatto prima, ossia ritirare un file in forma di byte array.
Due ordini di considerazioni rispetto alle procedure di upload:
  1. Manca qualcosa di corrispettivo a UploadTask.
  2. il metodo che si usa qui è storageRef.getBytes() laddove lì era storageRef.putBytes().
Dunque la cosa è simile.
Bisogna predisporre una variabile nella quale leggere il file.
Nell'esempio la variabile è ONE_MEGABYTE, ed è di tipo long.
Ecco:
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
        StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg");

        long ONE_MEGABYTE = 1024*1024;
        pathReference.getBytes(ONE_MEGABYTE);
Quello che non capisco è perché la variabile ONE_MEGABYTE sia eguagliata a 1024*1024.
Proviamo ugualmente.

Sì, non ottengo messaggi di errore, ma vorrei ottenere l'immagine, e non so come si faccia.
E' possibile convertire un long in un byte array?
Sicuramente sì, vediamo come si fa...

Ah, ma ecco: da una lettura più attenta leggo che quel ONE_MEGABYTE è soltanto un limite alla quantità di bytes scaricabile per evitare un sovraccarico di memoria nel dispositivo, non i bytes che compongono effettivamente il file.
Di conseguenza è necessario applicare i listeners perché in OnSuccessListener viene restituita la matrice di bytes che compone l'immagine.
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
        StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg");

        long ONE_MEGABYTE = 1024*1024;
        pathReference.getBytes(ONE_MEGABYTE).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

            }
        }).addOnSuccessListener(new OnSuccessListener<byte[]>() {
            @Override
            public void onSuccess(byte[] bytes) {

            }
        }); 
Ecco: ora io cerco di convertire, dopo averne ripassato la procedura, i bytes in bitmap.
        FirebaseStorage storage = FirebaseStorage.getInstance();
        StorageReference storageReference = storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
        StorageReference pathReference= storageReference.child("cazzate/facciadimerda.jpg");

        long ONE_MEGABYTE = 1024*1024;
        pathReference.getBytes(ONE_MEGABYTE).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

            }
        }).addOnSuccessListener(new OnSuccessListener<byte[]>() {
            @Override
            public void onSuccess(byte[] bytes) {
                Bitmap bitmap= BitmapFactory.decodeByteArray(bytes,0,bytes.length);
                imageView.setImageBitmap(bitmap);

            }
        }); 
Ho predisposto una ImageView nella quale far apparire l'immagine dopo averla convertita da array di bytes in bitmap.
E andiamo a provare...

Esperimento perfettamente riuscito!

Nessun commento:

Posta un commento