如何防止格式错误的上传?

时间:2017-08-06 08:33:27

标签: go google-cloud-platform google-cloud-storage

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

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()时应该会返回错误,但事实并非如此。当传输中断/损坏时,确保上传始终失败的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

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

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

在以后直接从云存储中回读时,验证这两者是否相同。这当然会影响性能,但它可以确保您获得放入GCS的内容。

这不是唯一可以看到损坏的地方 - 如果客户端停止向您的服务器传输或传输错误数据,则无法检测到它。如果是这样,在上传之前以其他方式检查完整性可能是您最好的选择。如果您的文件属于已知类型,您还可以通过验证它确实是一个有效的jpg文件来检查这种方式的完整性。

最好通过尝试重现并首先确定腐败发生的确切位置来验证您的假设,即GCS应该返回错误,而是静默地破坏给予它的数据。