web-dev-qa-db-ja.com

Flutterを使用してFirebase Storageファイルを削除する方法

私は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になります。

See screen shot

同じファイルでこれを見るので、これは混乱を招きます。

_/// 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'は私のアプリに関連しており、変更する必要があります。

9
earyzhe

よりクリーンなコードを実装しましたが、@ 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();
 }
0
harlandgomez