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.
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?
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.
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.