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不正确。

解决方案

  1. 计算md5前重置文件指针到文件的开头
complateFile.Seek(0,0)
  1. 合成文件后重新打开文件进行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验证失败")
}
posted @ 2024-05-14 06:32  元気田支店长  阅读(71)  评论(0编辑  收藏  举报