[JAVA] Compressez et téléchargez plusieurs fichiers sur Firebase Storage sur Android.

1. Je ne peux pas télécharger plusieurs fichiers!

Bien sûr, lorsque vous utilisez Firebase Storage sur Android`, il est naturel de télécharger plusieurs fichiers à la fois. Cependant, aucune API de ce type n'est actuellement disponible. J'étais en difficulté ... J'ai donc décidé de télécharger plusieurs fichiers sur Zip à la fois.

2. Mise en œuvre

SimpleFirebaseStorageDatabase.java


import android.content.Context;
import android.net.Uri;
import android.util.Log;

import androidx.annotation.NonNull;


import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.StorageReference;
import com.google.firebase.storage.UploadTask;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class SimpleFirebaseStorageDatabase {

    private static final String TAG = "SimpleFirebaseStorageDB";
    private String userId;
    private StorageReference storageRef;
    private DatabaseReference databaseRef;
    private Context mContext;

    private static final long MAX_DOWNLOAD_SIZE = 1024 * 1024 * 5;

    public SimpleFirebaseStorageDatabase (Context context, FirebaseAuth mAuth, String firebaseStorageBucketToken) {
        mContext = context;
        FirebaseUser user = mAuth.getCurrentUser();
        if (user == null) {
            return;
        }
        this.userId =  user.getUid();
        storageRef = FirebaseStorage.getInstance().getReferenceFromUrl(firebaseStorageBucketToken).child("users").child(userId);
    }
    public void uploadFilesByTempFile (final String projectName, List<String> uris) {

        File zip = zipFilesToFile(projectName, uris);
        if (zip == null) {
            Log.e(TAG, "No zip file is created: " + projectName);
            return;
        }
        try {
            storageRef.child(projectName).putFile(Uri.fromFile(zip)).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess (UploadTask.TaskSnapshot taskSnapshot) {
                    Log.d(TAG, "Succeeded to upload project : " + projectName);
                    storageRef.child(projectName).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess (Uri uri) {
                            Log.d(TAG, "Succeeded to get download url : " + uri);
                            onUploadSuccess(uri.toString());
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure (@NonNull Exception e) {
                            Log.e(TAG, "Failed to get download url : " + projectName, e);
                            onUploadFail();
                        }
                    });
                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure (@NonNull Exception e) {
                    Log.e(TAG, "Failed to upload project : " + projectName, e);
                    onUploadFail();
                }
            });
        } catch (Exception e) {
            onUploadFail();
        }

    }

    private File zipFilesToFile(String projectName, List<String> uris) {
        try {
            File projFile = new File(mContext.getFilesDir(), projectName);
            Log.d(TAG, "Make project zip file: " + projFile.getPath());
            //Supposons que le chemin du fichier de destination de sortie soit spécifié dans String outfilePath
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(projFile));
            byte[] buffer = new byte[1024 * 4];
            int len = 0;

            //Chaîne avec arguments, etc.[]Supposons que le chemin du fichier que vous souhaitez ajouter à zip soit spécifié en tant que fichiers
            for (String uri : uris) {
                zipOneFile(uri, out, buffer);
            }
            out.close();
            Log.d(TAG, "Succeeded to make project zip file: " + projFile.getPath());
            return projFile;
        } catch(Exception e){
            //La gestion des erreurs
            Log.e(TAG, "Failed to make project zip file: " + projectName, e);
        }
        return null;
    }


    /**
     *Ajoutez un fichier de l'URI spécifié à ZIP.
     * @param uri chemin du fichier à compresser(Uri)
     * @param os
     * @param buffer
     */
    private static void zipOneFile(String uri, ZipOutputStream os, byte[] buffer) {
        InputStream in = null;
        int len = 0;
        try {
            Log.d(TAG, "Zip one file : " + uri);
            String path = Uri.parse(uri).getPath();
            File inFile = new File(path);
            if (!inFile.exists()) {
                Log.w(TAG, "File doesn't exist: " + uri);
                return;
            }

            in = new FileInputStream(inFile);
            os.putNextEntry(new ZipEntry(inFile.getName())); //Conserver uniquement le nom de fichier du nom du chemin
            while ((len = in.read(buffer)) > 0) {
                os.write(buffer, 0, len);
            }
        } catch (Exception e) {
            Log.e(TAG, "Failed to zip file: " + uri, e);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException ioe) {
                    // do nothing
                }
            }
        }
    }

    private void onUploadSuccess (String downloadUri) {
        if (mContext instanceof OnFirebaseStorageUploadListener) {
            ((OnFirebaseStorageUploadListener) mContext).onUploadSucceed(downloadUri);
        }
    }

    private void onUploadFail () {
        if (mContext instanceof OnFirebaseStorageUploadListener) {
            ((OnFirebaseStorageUploadListener) mContext).onUploadFailed();
        }
    }

    public interface OnFirebaseStorageUploadListener {
        void onUploadSucceed (String downloadUri);
        void onUploadFailed ();
    }

3. Comment utiliser

MainActivity.java


public class MainActivity extends AppCompatActivity implements SimpleFirebaseStorageDatabase.OnFirebaseStorageUploadListener{

    private List<String> mUriList;

    @Override
    protected void onCreate (Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SimpleFirebaseStorageDatabase firebaseStorage = new SimpleFirebaseStorageDatabase(ShareProjectActivity.this, mAuth, "Jeton de seau");
        mUriList = // ...
        firebaseStorage.uploadFilesByTempFile("nom de fichier.zip", mUriList);
    }

    @Override
    public void onUploadSucceed (String downloadUri) {
        //Succès
    }

    @Override
    public void onUploadFailed () {
        //Échec
    }

Résumé

Il n'y a pas d'explication cette fois. J'écrirai le processus de téléchargement correspondant plus tard. Pour connaître le processus de connexion requis lors de l'utilisation de Firebase, cliquez ici (https://qiita.com/Cyber_Hacnosuke/items/0c291e240034872eba65) Twitter (Veuillez me suivre.): Https://twitter.com/Cyber_Hacnosuke

Recommended Posts

Compressez et téléchargez plusieurs fichiers sur Firebase Storage sur Android.
* Android * À propos de l'enregistrement / de la lecture de fichiers sur un stockage externe et des autorisations
* Android * Sauvegarde / chargement de fichiers sur le stockage interne
Charger et télécharger des notes en Java sur le stockage Azure
Comment utiliser OpenCV 4 sur Android et afficher la vue en direct de la caméra
Comment "évider" une vue sur Android
Comment affiner le format d'image de la galerie sur Android, puis sélectionner et importer plusieurs images
[Android] Comment activer / désactiver le panneau de notification à l'aide de StatusBarManager
Exemple d'affichage des notifications (tête haute) sur Android
Comment détecter les conflits de microphone sur Android
[Java] Comment sortir et écrire des fichiers!
* Android * Enregistrement / chargement d'images sur un stockage externe
De Java à C et de C à Java dans Android Studio
Étapes pour enregistrer un fichier Java sur GitHub
J'ai essayé d'utiliser "nifty cloud mobile backend" et l'authentification "Firebase" sur Kotlin + Android