[JAVA] Komprimieren Sie mehrere Dateien und laden Sie sie auf Android in Firebase Storage hoch.

1. Ich kann nicht mehrere Dateien hochladen!

Wenn Sie "Firebase Storage" auf "Android" verwenden, ist es natürlich selbstverständlich, mehrere Dateien gleichzeitig hochzuladen. Derzeit ist jedoch keine solche API verfügbar. Ich war in Schwierigkeiten ... Deshalb habe ich beschlossen, mehrere Dateien gleichzeitig auf Zip hochzuladen.

2. Implementierung

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());
            //Angenommen, der Pfad der Ausgabezieldatei ist in String outfilePath angegeben
            ZipOutputStream out = new ZipOutputStream(new FileOutputStream(projFile));
            byte[] buffer = new byte[1024 * 4];
            int len = 0;

            //String mit Argumenten etc.[]Angenommen, der Dateipfad der Datei, die Sie zu zip hinzufügen möchten, wird als Dateien angegeben
            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){
            //Fehlerbehandlung
            Log.e(TAG, "Failed to make project zip file: " + projectName, e);
        }
        return null;
    }


    /**
     *Fügen Sie eine Datei des angegebenen Uri zu ZIP hinzu.
     * @param uri Pfad der zu komprimierenden Datei(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())); //Behalten Sie nur den Dateinamen vom Pfadnamen
            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. Verwendung

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, "Eimer-Token");
        mUriList = // ...
        firebaseStorage.uploadFilesByTempFile("Dateiname.zip", mUriList);
    }

    @Override
    public void onUploadSucceed (String downloadUri) {
        //Erfolg
    }

    @Override
    public void onUploadFailed () {
        //Fehler
    }

Zusammenfassung

Diesmal gibt es keine Erklärung. Ich werde den entsprechenden Download-Prozess später schreiben. Klicken Sie hier, um den für die Verwendung von Firebase erforderlichen Anmeldevorgang anzuzeigen (https://qiita.com/Cyber_Hacnosuke/items/0c291e240034872eba65). Twitter (Bitte folgen Sie mir.): Https://twitter.com/Cyber_Hacnosuke

Recommended Posts

Komprimieren Sie mehrere Dateien und laden Sie sie auf Android in Firebase Storage hoch.
* Android * Informationen zum Speichern / Lesen von Dateien in einem externen Speicher und mit Berechtigungen
* Android * Speichern / Laden von Dateien in den internen Speicher
Laden Sie Notizen in Java in den Azure-Speicher hoch und laden Sie sie herunter
So verwenden Sie OpenCV 4 unter Android und zeigen die Kamera live an
Wie man eine Ansicht auf Android "aushöhlt"
So schränken Sie das Bildformat in der Galerie unter Android ein und wählen und importieren Sie dann mehrere Bilder
[Android] So aktivieren / deaktivieren Sie das Benachrichtigungsfeld mit StatusBarManager
Beispiel für die Anzeige von (Head-up-) Benachrichtigungen auf Android
So erkennen Sie Mikrofonkonflikte unter Android
[Java] Wie man Dateien ausgibt und schreibt!
* Android * Speichern / Laden von Bildern in einen externen Speicher
Von Java nach C und von C nach Java in Android Studio
Schritte zum Registrieren einer Java-Datei auf GitHub
Ich habe versucht, "nifty cloud mobile backend" und "Firebase" -Authentifizierung auf Kotlin + Android zu verwenden