golang 分片上傳md5校驗不一致問題

元気田支店长發表於2024-05-14

錯誤計算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驗證失敗")
}

相關文章