除了调用OnDelete()
之外,是否有其他方法可以确定在触发file.exists()
时文件是否确实被删除或是否已被更新(覆盖)?
OnDelete()
是在文件被删除或覆盖时触发的-这是一种预期的行为,如documentation中所述。
当用户删除个人资料照片时,我在应用程序中使用它。因此,在触发时,我无法确定图片是删除还是更新,因为在两种情况下都会触发。所以我必须手动检查发生了什么,这正是我的问题。
我显然可以使用file.exists()
来完成这项工作,但是我认为这是一个昂贵的电话(还是我错了吗?),因为这再次访问了存储,并且看来必须有一种避免它的方法。 ,但我不确定。
如果没有办法,我是否可以安全地假设exists()
永远不会在覆盖事件之前发生,从而导致错误的否定? (我担心它会在覆盖完成之前运行,找不到现有文件,然后返回false)。
答案 0 :(得分:1)
根据documentation,如果您使用版本存储桶,则OnDelete()
仅在“版本被永久删除时(但在归档对象时不会”时)触发。 “。
为了将您的存储桶转换为版本控制桶,请遵循以下文档:https://cloud.google.com/storage/docs/using-object-versioning#enable
答案 1 :(得分:1)
我的不使用版本控制的解决方案(用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")
}
简短说明: