firebase_storage 找不到对象 在所需的参考颤振中不存在对象



重要提示:我发现了同样的问题,但它因不完整的调试信息而关闭。

我正在将图片上传到 Firebase 存储,然后获取该图片的下载网址并将其存储到 Firebase,以便使用该网址通过网络图片显示用户的个人资料图片。

以前当我存储图像时它工作正常,例如

Reference storageRef = FirebaseStorage.instance.ref('images');
file = await _compressImage(file: file,);
await storageRef.putFile(file);
final String downloadUrl = await storageRef.child(id).getDownloadURL();
return downloadUrl;

但是在我将图像存储在特定文件夹中之后

Reference storageRef = FirebaseStorage.instance.ref('images');
file = await _compressImage(file: file, id: id);
await storageRef
.child(Get.find<UserController>().user.username)
.child(id)
.putFile(file);
final String downloadUrl = await storageRef.child(id).getDownloadURL();
return downloadUrl;

它显示此错误。

[firebase_storage/object-not-found] No object exists at the desired reference.

这是可解释的代码:我将可下载的URL存储在newImage变量中

String newImage;
if (_controller.file != null) {
newImage = await Database().uploadFile(
file: _controller.file,
id: Get.find<UserController>().user.username);
print("new image: " + newImage.toString());
}

但是在这里,当我打印 newImage 的值时,它将空打印到控制台

new image: null

这是将图片上传到Firebase存储的第二种方法。

Future<String> uploadFile({@required File file, @required String id}) async {
try {
file = await _compressImage(file: file, id: id);
await storageRef
.child(Get.find<UserController>().user.username)
.child(id)
.putFile(file);
final String downloadUrl = await storageRef.child(id).getDownloadURL();
return downloadUrl;
} catch (e) {
print(e);
}
}

调试控制台:

E/StorageException(11376): StorageException has occurred.
E/StorageException(11376): Object does not exist at location.
E/StorageException(11376):  Code: -13010 HttpResult: 404
E/StorageException(11376): {  "error": {    "code": 404,    "message": "Not Found.  Could not get object",    "status": "GET_OBJECT"  }}
E/StorageException(11376): java.io.IOException: {  "error": {    "code": 404,    "message": "Not Found.  Could not get object",    "status": "GET_OBJECT"  }}
E/StorageException(11376):  at com.google.firebase.storage.network.NetworkRequest.parseResponse(NetworkRequest.java:434)
E/StorageException(11376):  at com.google.firebase.storage.network.NetworkRequest.parseErrorResponse(NetworkRequest.java:451)
E/StorageException(11376):  at com.google.firebase.storage.network.NetworkRequest.processResponseStream(NetworkRequest.java:442)
E/StorageException(11376):  at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:272)
E/StorageException(11376):  at com.google.firebase.storage.network.NetworkRequest.performRequest(NetworkRequest.java:286)
E/StorageException(11376):  at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:70)
E/StorageException(11376):  at com.google.firebase.storage.internal.ExponentialBackoffSender.sendWithExponentialBackoff(ExponentialBackoffSender.java:62)
E/StorageException(11376):  at com.google.firebase.storage.GetDownloadUrlTask.run(GetDownloadUrlTask.java:76)
E/StorageException(11376):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
E/StorageException(11376):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
E/StorageException(11376):  at java.lang.Thread.run(Thread.java:764)
I/flutter (11376): [firebase_storage/object-not-found] No object exists at the desired reference.
I/flutter (11376): new image: null

但是当我检查火力存储并且图像在那里成功上传时。

我所知道的是,图像已成功上传到Firebase存储,但是上述方法在上传图像之前以某种方式返回了一个可关闭的URL。

对我有用的东西有点出乎意料。 首先,我有这样的代码,这是有多少个例子。

Reference reference = storage.ref(filePath);
UploadTask uploadTask = reference.putFile(imageToUpload);
final storageSnapshot = uploadTask.snapshot;
final downloadUrl = await storageSnapshot.ref.getDownloadURL();

然后,我决定玩弄它。 我注意到如果我等待 putFile 调用,它会更改返回类型,即使它不是将来。

Reference reference = storage.ref(filePath);
final TaskSnapshot snapshot = await reference.putFile(imageToUpload);
final downloadUrl = await snapshot.ref.getDownloadURL();

你知道什么,这奏效了!很奇怪,考虑到您可以等待 putFile 调用并不明显。

以下是我们的做法

Reference ref = FirebaseStorage.instance
.ref()
.child('user_Image')
.child('${authResult.user?.uid}.jpg');
UploadTask uploadTask = ref.putFile(imageUser);
final snapshot = await uploadTask.whenComplete(() => null);
final urlImageUser = await snapshot.ref.getDownloadURL();

我浪费了很多小时与您和 IDK 相同的问题,但它通过使用它之前创建引用来工作:

final FirebaseStorage feedStorage =
FirebaseStorage.instanceFor(bucket: F.feedBucket);

Reference refFeedBucket = feedStorage
.ref()
.child('venues')
.child(auth.user.uid)
.child('vibes')
.child(p.basename(file.path));
String downloadUrl;
TaskSnapshot uploadedFile = await refFeedBucket.putFile(file);
if (uploadedFile.state == TaskState.success) {
downloadUrl = await refFeedBucket.getDownloadURL();
}
return downloadUrl;

试试这个 用于从火力基地加载图片

Future<String> downloadedUrl(String imageName) async {
String downloadedUrl =
await storage.ref('$imageName').getDownloadURL();
return downloadedUrl;
}

就我而言,我在路上弄错了单词大小写的大小写。

Firebase 存储Case sensitive

请检查一下!

根据我在这里的理解,这里的问题是

final String downloadUrl = await storageRef.child(id).getDownloadURL();

在完成上传文件任务之前命中,结果返回异常,

firebase_storage object-not-found No object exists at the desired reference flutter

如果我们遍历Storage的所有功能,我们有另一种方法可以帮助我们知道任务是否完成,我们可以添加 await,然后点击getDownloadURL以获取 URL。

try {
String name = DateTime.now().millisecondsSinceEpoch.toString() + file.name;
Reference reference = _firebaseStorage.ref(FirebaseKey.images).child(name);
final metadata = SettableMetadata(
contentType: 'image/jpeg',
customMetadata: {'picked-file-path': file.path},
);
UploadTask task;
if (kIsWeb) {
task = reference.putData(await file.readAsBytes(), metadata);
} else {
task = reference.putFile(File(file.path), metadata);
}

/// wait for task completion
TaskSnapshot taskSnapshot = await task.whenComplete(() => {debugPrint('Task completed')});

return taskSnapshot.ref.getDownloadURL();
} on FirebaseException catch (e, stackTrace) {
debugPrint('Exception: on $e $stackTrace');
rethrow;
} catch (e, stackTrace) {
debugPrint('Exception: catch $e $stackTrace');
rethrow;
}

不要忘记在 Firebase Storage 中创建特定文件夹并允许对其进行读/写访问。

这是一个对我有用的示例规则:

service firebase.storage {
match /b/{bucket}/o {
match /profile_pictures/{allPaths=**} {
allow read, write;
}
}
}

我花了很多时间自己解决这个查询,实际上这个解决方案非常简单。

我只需要"等待"我之前发送的一些请求,用于将图像存储到 firebase 存储。

此外,等待getdownloadurl() mehtod也是必要的。

下面是之前和之后的示例代码

  • 之前

    final firebaseimageupload = FirebaseStorage.instance.ref().child('user_images').child('${userCredentials.user!.uid}.jpg');  
    firebaseimageupload.putFile(_selectedimage!);
    final imageurl = firebaseimageupload.getDownloadURL();
    
  • 后:

final firebaseimageupload = FirebaseStorage.instance.ref().child('user_images').child('${userCredentials.user!.uid}.jpg');

await firebaseimageupload.putFile(_selectedimage!);
final imageurl = await firebaseimageupload.getDownloadURL();

最新更新