golang 分片上传md5校验不一致问题
错误计算md5值
// 打开合成文件
complateFile, _ := os.Create("./test.zip")
defer complateFile.Close()
// 循环分片合成
for i := 0; i < 5; i++ {
// ... 省略中间步骤
complateFile.Write(fileBuffer)
}
// 计算分片md5进行比对
m5 := md5.New()
_, _ = io.Copy(m5, complateFile)
complateFileMd5 := hex.EncodeToString(m5.Sum(nil))
if complateFileMd5 != originalFileMd5{
fmt.Println("md5验证失败")
}
错误原因
在Go中,如果你在合并分片文件的过程中直接使用*os.File(即file指针)来计算MD5,这通常会导致计算错误,原因在于文件指针的位置。当你打开一个文件并开始读取时,文件指针默认位于文件的开头。如果你在合并过程中不重置文件指针,每次读取都会从上次停止的地方开始,而不是从头开始,导致计算的MD5不正确。
解决方案
- 计算md5前重置文件指针到文件的开头
complateFile.Seek(0,0)
- 合成文件后重新打开文件进行md5值计算
func(){
complateFile, _ := os.Create("./test.zip")
defer complateFile.Close()
for i := 0; i < 5; i++ {
// ... 省略中间步骤
complateFile.Write(fileBuffer)
}
}()
// 验证文件的完整性
file, _ := os.Open("./test.zip")
m5 := md5.New()
_, _ = io.Copy(m5, file)
complateFileMd5 := hex.EncodeToString(m5.Sum(nil))
if complateFileMd5 != originalFileMd5{
fmt.Println("md5验证失败")
}