【问题标题】:Determine whether a file was deleted or overwritten - Firebase Storage OnDelete()确定文件是否被删除或覆盖 - Firebase Storage OnDelete()
【发布时间】:2018-07-25 01:08:54
【问题描述】:

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

OnDelete() 已知会在文件被删除或覆盖时触发 - 这是documentation 中提到的预期行为。

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

我显然可以使用file.exists() 来完成这项工作,但我认为这是一个昂贵的调用(或者我错了吗?)因为这是再次访问存储,而且似乎必须有办法避免它,但是我不确定。

如果没有办法,我可以安全地假设exists() 永远不会出现在覆盖事件之前,从而导致误报吗? (我担心它会在覆盖完成之前运行,找不到现有文件并返回false)。

【问题讨论】:

    标签: firebase google-cloud-functions firebase-storage


    【解决方案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")
    }
    

    还有一个简短的解释:

    1. 根据文件名,先获取对象的引用。
    2. 从对象的引用中,尝试读取属性。
    3. 如果遇到错误,请检查该错误是否是因为文件不存在。
    4. 如果错误正确,则在文件被删除时执行您想要的操作。

    【讨论】:

    • 感谢您的分享,但在我看来它并不可靠。这一行: err.Error() == "storage: object doesn't exist" 很老套!
    • 也许,但是可能有另一种方法可以使用模板来处理错误,该模板可能在库中的某个地方进行比较,或者可能隐藏在里面的某个地方的错误代码。那时候还没有深入研究。而且事情可能也发生了变化,已经有一段时间了...如果您找到更好的选择,请随时通知我?
    • 我没有找到一个简单的解决方案,所以我决定改变我的逻辑!我喜欢 FB,但有时要克服这些缺乏功能非常耗时。
    【解决方案2】:

    根据documentation,如果您使用版本控制存储桶,OnDelete() 仅在“永久删除版本时(而不是归档对象时)”触发。。 p>

    要将您的存储桶转换为版本控制存储桶,请遵循以下文档:https://cloud.google.com/storage/docs/using-object-versioning#enable

    【讨论】:

    • 谢谢雷诺。它肯定会有所帮助,但是对象版本控制策略有其自身的缺点,我想避免这些缺点:数据使用费用更高,以及处理归档文件生命周期的新问题。如果没有其他人弹出,我会在几天内接受您的回答。谢谢!
    猜你喜欢
    • 2018-09-07
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    相关资源
    最近更新 更多