Uploading and downloading files to/from Google Cloud Firestore - android

I see that the Firebase has already a new beta version released, called Cloud Firestore. In the documentation all operations with the documents are described very well, but I am not able to find anything about uploading and downloading media files into the Cloud Firestore using Android...
Does anyone has any information/tutorial etc for uploading/downloading media files (for example mp3 files and images)?
Thank you very much in advance for the answers!

You can't store files to Firebase Cloud Firestore instead you can use the combination of Firebase Storage and Firebase Cloud Firestore to active the desired functionality.
Firebase Storage is to storage files and download from it.
Firebase Realtime Database is to store json no-sql database on it.
Firebase Cloud Firestore is advanced version of Firebase realtime database the difference from Realtime database is that it is Document based non-sql database.
Suppose you need to develop an application with database and storage you need combination of any of Database with Firebase Storage. Store files in firebase storage and save their urls in firebase realtime or firebase cloud firestore for downloading and uploading them.
To Upload file on firebase storage :
FirebaseStorage firebaseStorage;
//for firebase storage
firebaseStorage = FirebaseStorage.getInstance();
StorageReference storageReference;
storageReference = firebaseStorage.getReferenceFromUrl("url");
final StorageReference imageFolder = storageReference.child("" + imageName);
imageFolder.putFile(saveUri).addOnSuccessListener(new OnSuccessListener < UploadTask . TaskSnapshot >() {
#Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
//submitted sucessfully
imageFolder.getDownloadUrl().addOnSuccessListener(new OnSuccessListener < Uri >() {
#Override
public void onSuccess(Uri uri) {
Log.wtf(TAG, "download image path : " + uri.toString());
//now you have path to the uploaded file save this path to your database
uploadDataToUserUploadedImage(uri);
}
}).addOnFailureListener(new OnFailureListener () {
#Override
public void onFailure(#NonNull Exception e) {
getMvpView().stopProgressLoading();
getMvpView().onError("Fail to submit feedback " + e.getMessage());
getMvpView().hideLoading();
return;
}
});
}
}).addOnProgressListener(new OnProgressListener < UploadTask . TaskSnapshot >() {
#Override
public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
double progress =(100.0 * taskSnapshot.getBytesTransferred() / taskSnapshot.getTotalByteCount());
getMvpView().publishProgress((int) progress);
Log.d(TAG, "onProgress: " + progress);
}
}).addOnFailureListener(new OnFailureListener () {
#Override
public void onFailure(#NonNull Exception e) {
getMvpView().hideLoading();
getMvpView().stopProgressLoading();
getMvpView().onError("Error: " + e.getMessage());
}
});

Related

Update the file sent in Firebase

I wrote a program that uploads a series of data to firebase
My problem is that when new data is uploaded, the previous contents of the file in Firebase are deleted and new data is replaced.
It is possible to guide the previous data to be added to the new data
enter image description here
String key_press ="key pressed :"+sb;
reference= FirebaseStorage.getInstance().getReference().child("Dcument");
reference.child("file.txt").putBytes(sb.toString().getBytes()).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
#Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// Toast.makeText(MyAccessibilityService.this, "file upload seuccessfully", Toast.LENGTH_SHORT).show();
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Toast.makeText(MyAccessibilityService.this, e.toString(), Toast.LENGTH_SHORT).show();
}
});
When you write data to a path in Cloud Storage (with Firebase or any of the other SDKs) it replaces any data that existed at that path. There is no way to tell Cloud Storage to merge the data, as it treats all files/objects as blobs and doesn't have any knowledge about the file's structure.
So you will either have to read the existing data, merge that with your update, and then write the result to Cloud Storage, or store the new data as a separate file in Cloud Storage.

I m trying to backup my sqlite database file from local storage to Firebase Storage

I m using Firebase as my primary database, some of the local data is storing into sqlite.
I m trying to backup and restore my sqlite db file from local storage to Firebase Storage... I have uploaded the file and now i want to restore it into the same package/databases directory... but couldn't figure it out.
// uploading SQLITE.DB file to FIREBASE STORAGE
#SuppressLint("SdCardPath") String inFileName = "/data/data/com.example.casebook/databases/EVENTS_DB.db";
Uri localDB = Uri.fromFile(new File(inFileName));
final StorageReference DBRef = storageReference.child("users/"+fAuth.getCurrentUser().getUid()+"/EVENTS_DB.csv");
DBRef.putFile(localDB).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
#Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Toast.makeText(getApplicationContext(), "FILE UPLOADED", Toast.LENGTH_SHORT).show();
}
});
// downloading SQLITE.db file from FIREBASE STORAGE
DBRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
#Override
public void onSuccess(Uri uri) {
// here i want to get the "EVENTS_DB.db" file to the exact same path "inFileName" for restoring the same DB with help of FIREBASE STORAGE.
}
});

How to choose specified File to upload to Firebase Storage?

I would like to upload my SQLite database File to Firebase Storage. My problem is that I can only find tutorials where the user has to choose the file manually, but I would like to send a fixed file, so you can't send other data to Firebase storage.
How can I do that?
Thank you.
First get the reference to the firebase storage
// Create a storage reference from our app
StorageReference storageRef = storage.getReference();
Then to upload the file do the following:
Uri file = Uri.fromFile("sqlite_file");
StorageReference filesRef = storageRef.child("files");
uploadTask = filesRef.putFile(file);
// Register observers to listen for when the download is done or if it fails
uploadTask.addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception exception) {
// Handle unsuccessful uploads
}
}).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
#Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
// taskSnapshot.getMetadata() contains file metadata such as size, content-type, etc.
// ...
}
});

Firebase : How to check file already exist before Upload files [duplicate]

This question already has answers here:
How to check if a file exists in Firebase storage from your android application?
(5 answers)
Closed 4 years ago.
I use firebase storage for cloud storage
While uploading files I dont want to upload if the file is already exist in the storage reference. I just need to skip the upload and continue with the next file.
Currently I upload like this
String pathString = "/Files/" + filename;
StorageReference filepathReference = rootreference.child(pathString);
StorageReference uploadRef = filepathReference.child(pathString);
UploadTask uploadTask = uploadRef.putFile(file);
Which, apparently upload again and replace if the file already exists. I just want to skip the unwanted upload by making a check for the filename already exist in the storage bucket.
Is that possible?
Try to get metadata. If it failed, then file do not exist
uploadRef.getMetadata()
.addOnSuccessListener({ /*File exists*/ })
.addOnFailureListener({
//File do not exist
UploadTask uploadTask = uploadRef.putFile(file);
})
If you want to completely prohibit file overwrite, not just check file existence, you can specify security rule for storage like that
allow write: if resource.metadata == null; //
But I've never tested it, so I'm not sure about it, maybe just resource == null will work too
There is no such function as per now in firebase but you can do it manually by saving filename in the database. You can check for the filename is exists or not before uploading. You can use firestore for this operation.
This is to check image is exists or not
DocumentReference docRef = db.collection("images").document("file1");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
#Override
public void onComplete(#NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
// your code for uploading next image
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
// your code for uploading this image
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
This is for saving file name to the Database
Map<String, Object> image = new HashMap<>();
image.put("name", "file1");
db.collection("images").document("file1")
.set(image)
.addOnSuccessListener(new OnSuccessListener<Void>() {
#Override
public void onSuccess(Void aVoid) {
Log.d(TAG, "DocumentSnapshot successfully written!");
}
})
.addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception e) {
Log.w(TAG, "Error writing document", e);
}
});

How to get all files from firebase storage?

I have uploaded some files into Firebase directory and I want to list them and download one by one.There is no API/Documentation fo this.Could you help me ?
As of July 2019, version 18.1.0 of the Cloud Storage SDK now supports listing all objects from a bucket. You simply need to call listAll() in a StorageReference:
StorageReference storageRef = FirebaseStorage.getInstance().getReference();
// Now we get the references of these images
storageRef.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
#Override
public void onSuccess(ListResult result) {
for(StorageReference fileRef : result.getItems()) {
// TODO: Download the file using its reference (fileRef)
}
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(Exception exception) {
// Handle any errors
}
});
If you want to download these files, you can use one of the options shown in the Docs.
Please note that in order to use this method, you must opt-in to version 2 of Security Rules, which can be done by making rules_version = '2'; the first line of your security rules:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
first , you should get the file download Url to retrieve it, the easiest way is to upload a file and generate the download Url in your database, so after that you just go and retrieve each file from the storage like this :
private void downloadFile() {
FirebaseStorage storage = FirebaseStorage.getInstance();
StorageReference storageRef = storage.getReferenceFromUrl("<your_bucket>");
StorageReference islandRef = storageRef.child("file.txt");
File rootPath = new File(Environment.getExternalStorageDirectory(), "file_name");
if(!rootPath.exists()) {
rootPath.mkdirs();
}
final File localFile = new File(rootPath,"imageName.txt");
islandRef.getFile(localFile).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
#Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
Log.e("firebase ",";local tem file created created " +localFile.toString());
// updateDb(timestamp,localFile.toString(),position);
}
}).addOnFailureListener(new OnFailureListener() {
#Override
public void onFailure(#NonNull Exception exception) {
Log.e("firebase ",";local tem file not created created " +exception.toString());
}
});
}
I personally use this method, whenever you upload a file, save its download URL in your Firebase Database, if you are uploading multiple files then save it in an array. There is no method for Firebase Storage android to download and upload multiple files in one go.
Whenever you want to download files access your firebase database for those URL's.

Categories

Resources