JavascriptProva

venerdì 2 settembre 2016

Prima esperienza di storage di files in Firebase: storage di un'immagine come array di bytes.

Vediamo adesso come si trasferisce un file su Firebase.
Ho inserito in Gradle la API necessaria.

Non importa se non ho capito bene: cominciamo ad agire su quello che finora ho capito.
Per prima cosa si deve creare un riferimento allo Storage, ossia alla "sede" dove verranno caricate le immagini, suppongo.
Vediamo...

... Per prima cosa, vedo in questa pagina del tutorial una variabile storage che deve pur essere stata creata da qualche parte.
Risalendo fino a questa pagina trovo la dichiarazione e definizione della variabile.
La ripeto:
FirebaseStorage storage=FirebaseStorage.getInstance();
Adesso si deve creare un riferimento a un "bucket" (secchio) nel quale vengono caricate le immagini.
Per fare questo è necessario un URL, che va ricavato secondo le istruzioni presenti nella pagina.

        FirebaseStorage storage=FirebaseStorage.getInstance();
        StorageReference storageRef=storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");
Ora proviamo a fare un upload.
Da quello che ho capito, si può fare direttamente con un file bitmap...
Proviamo il putBytes.
Prima va "ridotta" la bitmap a un byte array, secondo il procedimento che ho ripassato.
        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
        byte[] b=stream.toByteArray();
Poi va "spedita" questa byteArray! Vediamo come si fa...

Ecco si usa UploadTask.
        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
        byte[] b=stream.toByteArray();

        UploadTask uploadTask=storageRef.putBytes(b);
E proviamo il lancio...

Non riuscito perché inizialmente non avevo specificato il nome del file. Avrebbe dovuto essere così:
  StorageReference storageRef=storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com/facciadaculo.jpg");
...per salvare nella specifica directory, ossia nella directory base del bucket, il file facciadiculo.jpg.

Ci riprovo, mettendo il codice completo:
        FirebaseStorage storage=FirebaseStorage.getInstance();
        StorageReference storageRef=storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com/facciadaculo.jpg");


        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
        byte[] b=stream.toByteArray();

        UploadTask uploadTask=storageRef.putBytes(b);
Il caricamento è riuscito!!!.

Ora carico lo stesso file in una sottodirectory:
        FirebaseStorage storage=FirebaseStorage.getInstance();
        StorageReference storageRef=storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");

        StorageReference childRef=storageRef.child("cazzate/facciadaculo.jpg");

        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
        byte[] b=stream.toByteArray();

        UploadTask uploadTask=childRef.putBytes(b);
Ecco: ci sono riuscito dopo un po' di tentativi riusciti male, durante i quali ho appreso che creando un riferimento a un child, in modo da creare la sottocartella, bisogna specificare anche il nome del file.
Adesso lo salvo, sempre nella stessa sottocartella, con un nome diverso:
        FirebaseStorage storage=FirebaseStorage.getInstance();
        StorageReference storageRef=storage.getReferenceFromUrl("gs://jaccaprogetto.appspot.com");

        StorageReference childRef=storageRef.child("cazzate/facciadimerda.jpg");

        Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo);
        ByteArrayOutputStream stream=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);
        byte[] b=stream.toByteArray();

        UploadTask uploadTask=childRef.putBytes(b);
Perfetto! Adesso ho sempre la stessa sottocartella cazzate con due files uguali dei quali uno si chiama facciadaculo.jpg e uno facciadimerda.jpg! (Si tratta della mia faccia... :-D )

Nessun commento:

Posta un commento