Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to delete a Firebase Storage file with flutter?

Tags:

I'm new to both Flutter and Firebase, so bear with me on this one.

I am trying to delete a File in my Firebase Storage using the file Url.

I have the full Url of the file and remove all characters excluding the file path.

Then I try to delete the file. From following other answers on here I use the command; FirebaseStorage.instance.ref().child(filePath).delete()

Below is my code;

static void deleteFireBaseStorageItem(String fileUrl){    String filePath = 'https://firebasestorage.googleapis.com/v0/b/dial-i-2345.appspot.com/o/default_images%2Fuser.png?alt=media&token=c2ccceec-8d24-42fe-b5c0-c987733ac8ae'                   .replaceAll(new                    RegExp(r'https://firebasestorage.googleapis.com/v0/b/dial-in-2345.appspot.com/o/'), '');    FirebaseStorage.instance.ref().child(filePath).delete().then((_) => print('Successfully deleted $filePath storage item' ));  } 

The problem is the file never gets deleted.

I think I have tracked down where the problem is.

In the .delete() method there is a required 'app' and 'storageBucket' value.

When I run this function the values are null.

See screen shot

I find this confusing because in the same file i see this;

/// The [FirebaseApp] instance to which this [FirebaseStorage] belongs. /// /// If null, the default [FirebaseApp] is used. final FirebaseApp app;  /// The Google Cloud Storage bucket to which this [FirebaseStorage] belongs. /// /// If null, the storage bucket of the specified [FirebaseApp] is used. final String storageBucket;enter code here 

From the documentation I can see maybe I need to use the 'Firebase core' plugin to make the app which links the bucket to that database. But there is not much specific to Dart & flutter.

Does anyone have any experience with this?

Found Temporary solution

So there is not a method to convert the Url to a storage reference at the moment. Hopefully it will come out in a Firebase update.

Here was my hack

 static void deleteFireBaseStorageItem(String fileUrl){  String filePath = fileUrl                   .replaceAll(new                    RegExp(r'https://firebasestorage.googleapis.com/v0/b/dial-in-2345.appspot.com/o/'), '');  filePath = filePath.replaceAll(new RegExp(r'%2F'), '/');  filePath = filePath.replaceAll(new RegExp(r'(\?alt).*'), '');  StorageReference storageReferance = FirebaseStorage.instance.ref();  storageReferance.child(filePath).delete().then((_) => print('Successfully deleted $filePath storage item' )); 

}

I know.... i know....

Ps 'dial-in-2345.appspot.com' is relevant to my app and you would need to change it.

like image 240
earyzhe Avatar asked Jan 13 '19 15:01

earyzhe


People also ask

How do I delete files from Firebase storage in Flutter?

To delete a file, first create a reference to that file. Then call the delete() method on that reference. await desertRef. delete();

How do I delete storage folders in Firebase?

Identify the unique Firebase storage folder(virtual path) that needs to be deleted using the information from the document path on which the function is triggered. Access the storage account associated with the app in the function and delete the target folder.


2 Answers

Update (2021-05-22):

FirebaseStorage.instance.refFromURL(url).delete() should be used now. getReferenceFromUrl that was suggested earlier seems to be gone from the API.

Update (2019-08-03):

According to this PR there is now a getReferenceFromUrl method in FlutterFire that allows looking up a storage reference by its download URL.


Previous answer:

On Android you can call getReferenceForUrl() to get a StorageReference from a download URL, and a similar method exists on iOS.

But I can't find a corresponding method in the FlutterFire reference docs. This unfortunately means that there is no way to map from a download URL back to a StorageReference in Flutter.

This sounds like an omission, so I recommend casting your +1 on this feature request.

For the moment this means you'll need to have the relative path to the file in Cloud Storage to be able to delete it from Flutter. With that path, your current code would work.

like image 83
Frank van Puffelen Avatar answered Oct 10 '22 14:10

Frank van Puffelen


change filePath to

String filePath = 'https://firebasestorage.googleapis.com/v0/b/dial-in-21c50.appspot.com/o/default_images%2Fuser.png?alt=media&token=c2ccceec-8d24-42fe-b5c0-c987733ac8ae'                   .replaceAll(new                    RegExp(r'https://firebasestorage.googleapis.com/v0/b/dial-in-21c50.appspot.com/o/default_images%2F'), '').split('?')[0];  FirebaseStorage.instance.ref().child(filePath).delete().then((_) => print('Successfully deleted $filePath storage item' )); 
like image 32
Abdel Hameed Avatar answered Oct 10 '22 13:10

Abdel Hameed