确定文件是否被删除或覆盖-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,但有时克服这些功能的缺乏是非常耗时的。