我对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'值。
当我运行此函数时,其值为空。
我发现这令人困惑,因为在同一文件中我看到了这一点;
/// 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'与我的应用有关,您需要进行更改。
答案 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)
根据最新的重大更改,这是我使用的以下简单方法。
将最新的 firebase_storage 以及它需要的所有其他相关更新导入您的 pubspec.yaml。目前这是 firebase_storage 的以下内容:
依赖: firebase_storage: ^7.0.0
导入包如下:
导入 'package:firebase_storage/firebase_storage.dart' 作为 firebase_storage;
最后,在 try catch 中,您可以执行以下操作:
试试 { 等待 firebase_storage.FirebaseStorage.instance.ref('/images/something.jpg').delete(); }赶上(e){ debugPrint('错误删除 $yourReference: $e'); }
答案 10 :(得分:0)
2021 年 8 月 10 日
如果你想从 firebase 中删除图像,你必须有那个图像的 url,就像 :
<块引用> Reference photoRef =await FirebaseStorage.instance.refFromURL(imageUrl);
await photoRef.delete().then((value) {
print('deleted Successfully');
});