How to delete a Firebase Storage file with flutter?

earyzhe picture earyzhe · Jan 13, 2019 · Viewed 7.5k times · Source

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.

Answer

Frank van Puffelen picture Frank van Puffelen · Jan 14, 2019

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.