我有一个相当简单的代码,可以使用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()
时应该会返回错误,但事实并非如此。当传输中断/损坏时,确保上传始终失败的最佳方法是什么?
答案 0 :(得分:1)
您可以在上传字节之前和之后尝试以下检查:
在以后直接从云存储中回读时,验证这两者是否相同。这当然会影响性能,但它可以确保您获得放入GCS的内容。
这不是唯一可以看到损坏的地方 - 如果客户端停止向您的服务器传输或传输错误数据,则无法检测到它。如果是这样,在上传之前以其他方式检查完整性可能是您最好的选择。如果您的文件属于已知类型,您还可以通过验证它确实是一个有效的jpg文件来检查这种方式的完整性。
最好通过尝试重现并首先确定腐败发生的确切位置来验证您的假设,即GCS应该返回错误,而是静默地破坏给予它的数据。