如何检查文件是不是存在于 Firebase 存储中?

Posted

技术标签:

【中文标题】如何检查文件是不是存在于 Firebase 存储中?【英文标题】:how to check if file exists in Firebase Storage?如何检查文件是否存在于 Firebase 存储中? 【发布时间】:2016-10-11 14:18:58 【问题描述】:

使用数据库时,您可以通过snapshot.exists() 来检查某些数据是否存在。根据文档,没有类似的存储方法。

https://firebase.google.com/docs/reference/js/firebase.storage.Reference

检查某个文件是否存在于 Firebase 存储中的正确方法是什么?

【问题讨论】:

【参考方案1】:

我相信 FB 存储 API 的设置方式是用户只请求存在的文件。

因此,必须将不存在的文件作为错误处理: https://firebase.google.com/docs/storage/web/handle-errors

【讨论】:

【参考方案2】:

您可以使用getDownloadURL,它返回一个Promise,它又可以用来捕获“未找到”错误,或者处理文件(如果存在)。例如:

storageRef.child("file.png").getDownloadURL().then(onResolve, onReject);

function onResolve(foundURL) 
    //stuff


function onReject(error) 
    console.log(error.code);

【讨论】:

警告:如果您有数千个文档,下载网址可能会很昂贵,因为下载网址将由 Firebase 定价。【参考方案3】:

我找到了一个很好的解决方案,同时使用 File.exists 保留在 Node.js Firebase Gogole 云存储 SDK 中,告诉搜索者共享它是理想的选择。

const admin = require("firebase-admin");
const bucket = admin.storage().bucket('my-bucket');

const storageFile = bucket.file('path/to/file.txt');
storageFile
  .exists()
  .then(() => 
    console.log("File exists");
  )
  .catch(() => 
    console.log("File doesn't exist");
  );

Google Cloud Storage: Node.js SDK version 5.1.1 (2020-06-19) 在撰写本文时

【讨论】:

示例代码错误。检查文档上的示例:googleapis.dev/nodejs/storage/5.1.1/File.html#exists-examples【参考方案4】:

Firebase 添加了一个 .exists() 方法。另一个人回应并提到了这一点,但他们提供的示例代码不正确。我自己在寻找解决方案时发现了这个线程,起初我很困惑,因为我尝试了他们的代码,但即使文件明显不存在,它也总是返回“文件存在”。

exists() 返回一个包含布尔值的数组。使用它的正确方法是检查布尔值,如下所示:

const storageFile = bucket.file('path/to/file.txt');
storageFile
  .exists()
  .then((exists) => 
        if (exists[0]) 
          console.log("File exists");
         else 
          console.log("File does not exist");
        
     )

我分享这个是为了让下一个找到这个帖子的人可以看到它并节省一些时间。

【讨论】:

谢谢。这种方法有谷歌文档吗?好像没找到。 @GrantSingleton 我自己也找不到任何官方文档。 @GrantSingleton 更正:有一个参考。如果您向下滚动,另一位海报在同一主题的进一步评论中分享了它。 googleapis.dev/nodejs/storage/5.1.1/File.html#exists-examples 确保检查 exists[0] 而不是 exists。那是我的愤怒 @BrandonPillay 对我来说它来自:const fbAdmin = require('firebase-admin'); const bucketName = projectId + '.appspot.com'; const bucket = fbAdmin.storage().bucket(bucketName);【参考方案5】:

这对我有用

  Future<bool> fileExists(String file) async 
    var parts = file.split('/');
    var path = parts.sublist(0, parts.length - 1).join('/');
    var listResult = await _storage.ref().child(path).list();
    return listResult.items.any((element) => element.fullPath == file);
  

【讨论】:

一个好的答案将始终包括解释为什么这会解决问题,以便 OP 和任何未来的读者可以从中学习

以上是关于如何检查文件是不是存在于 Firebase 存储中?的主要内容,如果未能解决你的问题,请参考以下文章

Flutter & Firebase:如何检查某个项目是不是存在于 Firebase 文档中的数组中

如何使用angularfire2检查孩子是不是存在于firebase列表中

Firebase 规则 - 如何检查用户是不是存在于子文档中

当用户在flutter中使用otp方法登录时,如何检查用户详细信息是不是已经存在于firebase中? [复制]

如何检查 Firebase 实时数据库(Dart/Flutter)中是不是存在值?

如何检查文件是不是存在于android设备的特定文件夹中