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.
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 ();
}
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
}
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