如何用Flutter删除Firebase Storage文件?

时间:2019-01-13 15:19:09

标签: firebase dart flutter firebase-storage

我对Flutter和Firebase还是陌生的,所以请耐心等待。

我正在尝试使用文件网址删除Firebase存储中的文件。

我拥有文件的完整网址,并删除了文件路径以外的所有字符。

然后我尝试删除该文件。从下面的其他答案开始,我使用命令; 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'值。

当我运行此函数时,其值为空。

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”插件来制作将存储桶链接到该数据库的应用。但是Dart和Flutter并没有什么特别的。

有人对此有任何经验吗?

找到了临时解决方案

因此,目前尚无方法将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'与我的应用有关,您需要进行更改。

11 个答案:

答案 0 :(得分:2)

关于@Frank van Puffelen,这里是参考URL从Firebase存储中删除文件的代码段

  if (oldUrl != null) {
  var fileUrl = Uri.decodeFull(Path.basename(oldUrl))
      .replaceAll(new RegExp(r'(\?alt).*'), '');
  StorageReference photoRef = await FirebaseStorage.instance
      .ref()
      .getStorage()
      .getReferenceFromUrl(oldUrl);
  try {
    await photoRef.delete();
  } catch (e) {}
}

完整方法

Future<UserItem> uploadUserImage(String filePath, {String oldUrl}) async {
 if (oldUrl != null) {
  var fileUrl = Uri.decodeFull(Path.basename(oldUrl))
      .replaceAll(new RegExp(r'(\?alt).*'), '');
  StorageReference photoRef = await FirebaseStorage.instance
      .ref()
      .getStorage()
      .getReferenceFromUrl(oldUrl);
  try {
    await photoRef.delete();
  } catch (e) {}
}

Im.Image image = Im.decodeImage(File(filePath).readAsBytesSync());

// todo cleanup string formation
final StorageReference storageReference =
    FirebaseStorage().ref().child('user_images').child(
          DateTime.now().millisecondsSinceEpoch.toString() +
              '.' +
              filePath.split(".")[1],
        );
final StorageUploadTask uploadTask = storageReference.putFile(
  File(filePath),
);

/// wait for upload to complete
await uploadTask.onComplete;

/// get the uploaded items url
String url = await (storageReference.getDownloadURL());

/// add the pic to FireStore Instance
FirebaseUser user = await FirebaseAuth.instance.currentUser();
String token = user.uid;

/// adds the item to the corresponding token path
await _fireStore
    .document('$token')
    .setData({'userImage': url}, merge: true);

return await getUserData();
}

答案 1 :(得分:2)

=== 2020 年 12 月 ===

非常感谢您的回答,这只是一个更新,因为旧方法导致我的应用崩溃。

import 'package:firebase_storage/firebase_storage.dart';
import 'package:path/path.dart' as Path;

String fileUrl =Uri.decodeFull(Path.basename(i)).replaceAll(RegExp(r'(\?alt).*'), '');
StorageReference ref = FirebaseStorage.instance.ref().child(fileUrl);
await ref.delete();

答案 2 :(得分:2)

3. 3. 2021

我不确定过去如何(因为我对 Flutter 和 Firebase 还很陌生),但目前它很简单。假设您要从 Firebase 存储中删除图像。为此,您将编写以下方法:

import 'package:firebase_storage/firebase_storage.dart';

//firebase Storage reference
  final _storage = FirebaseStorage.instanceFor(
      bucket: [your bucket address]);

Future<void> deleteImageFromDB(String imageUrl) async {
    var photo = _storage.refFromURL(imageUrl);
    await photo.delete();
  }

答案 3 :(得分:1)

在Android上,您可以调用getReferenceForUrl()从下载URL中获取StorageReference,iOS上也存在类似的方法。

但是我在FlutterFire reference docs中找不到相应的方法。不幸的是,这意味着在Flutter中无法从下载URL映射回StorageReference

这听起来像是一个遗漏,所以我建议在此feature request上投放+1。

目前,这意味着您需要在Cloud Storage中具有文件的相对路径,才能将其从Flutter中删除。使用该路径,您当前的代码将起作用。

答案 4 :(得分:1)

我实现了更简洁的代码,但与@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();
 }

答案 5 :(得分:1)

 if (post.imageURL != null) {
    StorageReference photoRef =
        await FirebaseStorage.instance.getReferenceFromUrl(post.imageURL);

    await photoRef.delete();
  }

答案 6 :(得分:0)

将filePath更改为

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' ));

答案 7 :(得分:0)

此功能对于Firebase存储链接非常有效

static Future<bool> deleteFileFromFirebaseByUrl(String urlFile) async {
String fileName = urlFile.replaceAll("/o/", "*");
fileName = fileName.replaceAll("?", "*");
fileName = fileName.split("*")[1];
print(fileName);
StorageReference storageReferance = FirebaseStorage.instance.ref();
storageReferance
    .child(fileName)
    .delete()
    .then((_) => print('Successfully deleted $fileName storage item')); }

答案 8 :(得分:0)

您必须创建StorageReference storageReference;的实例,然后像进行初始化一样

storageReference = await FirebaseStorage.instance
                              .getReferenceFromUrl('photoUrl');

您必须具有photoUrl,以便storageReference指向正确的图像。然后就像删除它一样

storageReference.delete();

全部完成。

答案 9 :(得分:0)

根据最新的重大更改,这是我使用的以下简单方法。

  1. 将最新的 firebase_storage 以及它需要的所有其他相关更新导入您的 pubspec.yaml。目前这是 firebase_storage 的以下内容:

    依赖: firebase_storage: ^7.0.0

  2. 导入包如下:

    导入 'package:firebase_storage/firebase_storage.dart' 作为 firebase_storage;

  3. 最后,在 try catch 中,您可以执行以下操作:

    试试 { 等待 firebase_storage.FirebaseStorage.instance.ref('/images/something.jpg').delete(); }赶上(e){ debugPrint('错误删除 $yourReference: $e'); }

答案 10 :(得分:0)

2021 年 8 月 10 日

如果你想从 firebase 中删除图像,你必须有那个图像的 url,就像 :

<块引用>

https://firebasestorage.googleapis.com/v0/b/ecommerce-c962d.appspot.com/o/images%2F2021-08-03T11%3A10%3A27.616369?alt=media&token=5310a745-9533-47ef-8de1-db876933ff6f 然后你只需要在里面传递那个网址:

 Reference photoRef =await FirebaseStorage.instance.refFromURL(imageUrl);
 await photoRef.delete().then((value) {
  print('deleted Successfully');
});