私はFlutterとFirebaseの両方が初めてなので、これについては我慢してください。
ファイルのURLを使用してFirebase Storageのファイルを削除しようとしています。
ファイルの完全なURLを取得し、ファイルパスを除くすべての文字を削除します。
次に、ファイルを削除しようとします。ここで他の回答に従うことから、私はコマンドを使用します。 FirebaseStorage.instance.ref().child(filePath).delete()
以下は私のコードです。
_static void deleteFireBaseStorageItem(String fileUrl){
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/'), '');
FirebaseStorage.instance.ref().child(filePath).delete().then((_) => print('Successfully deleted $filePath storage item' ));
}
_
問題は、ファイルが削除されないことです。
私は問題がどこにあるかを追跡したと思います。
.delete()
メソッドには、必須の「app」および「storageBucket」値があります。
この関数を実行すると、値がnullになります。
同じファイルでこれを見るので、これは混乱を招きます。
_/// 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
_
ドキュメントから、バケットをそのデータベースにリンクするアプリを作成するために「Firebase core」プラグインを使用する必要があるかもしれません。しかし、ダート&フラッターに固有のものはあまりありません。
誰かこれについて何か経験がありますか?
そのため、現時点ではUrlをストレージ参照に変換する方法はありません。うまくいけば、それはFirebaseアップデートで出てくるでしょう。
ここに私のハックがありました
_ static void deleteFireBaseStorageItem(String fileUrl){
String filePath = fileUrl
.replaceAll(new
RegExp(r'https://firebasestorage.googleapis.com/v0/b/dial-in-21c50.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' ));
_
}
分かった分かった....
Ps 'dial-in-21c50.appspot.com'は私のアプリに関連しており、変更する必要があります。
よりクリーンなコードを実装しましたが、@ earyheと同じで、Uri.decodeFull()とPath.basename()を使用しています。試してみましたが、うまくいきました。
import 'package:path/path.Dart' as Path;
Future<void> deleteImage(String imageFileUrl) async {
var fileUrl = Uri.decodeFull(Path.basename(imageFileUrl)).replaceAll(new RegExp(r'(\?alt).*'), '');
final StorageReference firebaseStorageRef =
FirebaseStorage.instance.ref().child(fileUrl);
await firebaseStorageRef.delete();
}