Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定文件是否被删除或覆盖-Firebase Storage OnDelete()_Firebase_Google Cloud Functions_Firebase Storage - Fatal编程技术网

确定文件是否被删除或覆盖-Firebase Storage OnDelete()

确定文件是否被删除或覆盖-Firebase Storage OnDelete(),firebase,google-cloud-functions,firebase-storage,Firebase,Google Cloud Functions,Firebase Storage,除了调用file.exists(),是否有其他方法可以确定文件是否被真正删除,或者在触发OnDelete()时文件是否被更新(覆盖) OnDelete()已知在文件被删除或覆盖时会被触发-这是一种预期行为,如中所述 当用户删除其个人资料图片时,我会在我的应用程序中使用它。所以当被触发时,我无法判断图片是被删除还是被更新,因为这两种情况下都会被触发。所以我必须手动检查发生了什么,这正是我的问题 我可以很明显地使用文件.EngsFor(,但是我认为这是一个昂贵的调用(或者我错了吗?)因为这是再次访问

除了调用
file.exists()
,是否有其他方法可以确定文件是否被真正删除,或者在触发
OnDelete()
时文件是否被更新(覆盖)

OnDelete()
已知在文件被删除或覆盖时会被触发-这是一种预期行为,如中所述

当用户删除其个人资料图片时,我会在我的应用程序中使用它。所以当被触发时,我无法判断图片是被删除还是被更新,因为这两种情况下都会被触发。所以我必须手动检查发生了什么,这正是我的问题

我可以很明显地使用<代码>文件.EngsFor(<)/代码>,但是我认为这是一个昂贵的调用(或者我错了吗?)因为这是再次访问存储,看起来必须有一种避免它的方法,但我不确定。 如果没有办法,我是否可以安全地假设

exists()
永远不会在覆盖事件之前出现,从而导致误判?(我担心它会在覆盖完成之前运行,找不到任何现有文件,并返回false)。

根据,如果使用版本控制桶,
OnDelete()
仅在“永久删除版本时(但在存档对象时不触发)。 为了将您的bucket转换为版本控制bucket,请遵循以下文档:

我的解决方案(用Go编写,但其背后的原理保持不变),用于不使用版本控制时:

func main(ctx context.Context, event GCSEvent) error {
    obj := bucket.Object(event.Name)
    _, err = obj.Attrs(ctx) // _ => objAttrs
    if err != nil {
        if err.Error() == "storage: object doesn't exist" {
            // This file is deleted, so execute a function
            onFileDeleted()
            return nil
        } else {
            // Something else went wrong, identify it
            log.Fatalf("Getting attributes error: %v", err, e.Name[7:27])
        }
    }
    // This means file was merely updated
    return nil
}

func onFileDeleted() {
  log.Println("File deleted")
}
还有一个简短的解释:

  • 根据文件名,首先获取对象的引用
  • 从对象的引用中,尝试读取属性
  • 如果遇到错误,请检查该错误是否是因为文件不存在
  • 如果错误正确,请在删除文件时执行所需操作

  • 谢谢雷诺。这肯定会有所帮助,但对象版本控制策略有其自身的缺点,我希望避免这些缺点:对数据使用收取更高的费用,以及在整个生命周期中处理归档文件的新难题。如果没有其他人出现,我会在几天后接受你的回答。谢谢谢谢你的分享,但在我看来,它似乎不健全。这行代码:err.Error()==“存储:对象不存在”非常粗糙!也许,但可能有另一种方法可以使用错误模板,该模板可能位于库中某个位置以进行比较,或者可能隐藏在其中某个位置的错误代码。那时候我还没有深入研究过。从那以后事情可能也发生了变化,已经有一段时间了。。。如果你找到更好的选择,请随时通知我?我没有找到一个简单的解决方案,所以我决定改变我的逻辑!我喜欢FB,但有时克服这些功能的缺乏是非常耗时的。