我有一个相当简单的代码,可以使用Golang将文件上传到Google Cloud Storage。

func upload(object *storage.ObjectHandle, b []byte) error {
    w := object.NewWriter(context.Background())

    if _, err = w.Write(b); err != nil {
        return err
    }
    return w.Close()
}

我上传了许多文件,没有任何问题,但是昨天我注意到其中一个文件已损坏。我相当确定文件是在上传期间损坏的,因为我是根据文件内容的MD5哈希命名文件的。我相信Google云端存储在调用w.Close()时应该返回了错误,但没有返回。确保传输中断/损坏时上传始终失败的最佳方法是什么?

最佳答案

您可以在上传字节之前和之后尝试以下检查:

  • 存储len(b)个字节
  • 存储sha256字节的哈希值

  • 之后立即直接从云存储中读回时,请确保这两个都相同。当然,这可能会影响性能,但可以确保您获得放入GCS的能力。

    但是,这不是唯一可以看到损坏的地方-如果客户端停止将坏数据传输或传输到服务器,则不会检测到它。如果是这样,那么最好在上载之前以其他方式检查完整性。如果您的文件属于已知类型,则还可以通过验证其是否确实为有效的jpg文件来检查完整性。

    最好尝试重现并准确找出损坏发生的位置,以验证您的假设,即GCS应该返回错误,然后静默破坏提供给它的数据,这可能是最好的。

    10-01 02:46
    查看更多