網(wǎng)站制作的重要流程圖百度排行榜前十名
在go語言的開發(fā)中,當(dāng)我們在操作下載或者上傳文件對象時, 我們可以利用golang內(nèi)置的io包中的 TeeReader函數(shù)特性,高效實時計算文件的md5值。 方法如下:
TeeReader高效計算文件md5示例
保存上傳文件,并使用文件的md5簽名.擴展名 作為保存文件名,再讀取上傳文件的同時計算文件md5簽名
// 上傳文件 使用文件md5簽名.ext 作為文件名
func UploadFile(file *multipart.FileHeader) (string, error) {f, err := file.Open() // 讀取文件if err != nil {return "", fmt.Errorf("error reading multipart file: %v", err)}defer f.Close() // 創(chuàng)建文件 defer 關(guān)閉// 計算文件md5 這里使用 TreeReader的特性在拷貝文件的同時 高效計算文件md5md5 := md5.New()treeReader := io.TeeReader(f, md5)fmd5 := hex.EncodeToString(md5.Sum(nil)) // 獲取上傳文件的md5簽名字符串// 拼接目標(biāo)文件 使用文件md5簽名.ext 作為文件名dstFile := filepath.Join("upload", fmd5+filepath.Ext(file.Filename) )// 創(chuàng)建目標(biāo)文件對象dst, err := os.Create(dstFile)if err != nil {return "", fmt.Errorf("error creating dst file: %v", err)}defer dst.Close() // 創(chuàng)建文件 defer 關(guān)閉// 從treeReader將文件拷貝到目標(biāo)文件 dstif _, err = io.Copy(dst, treeReader); err != nil {return "", fmt.Errorf("error Copy file to destination: %v", err)}return dstFile, nil
}
TeeReader函數(shù)定義參考
// TeeReader returns a [Reader] that writes to w what it reads from r.
// All reads from r performed through it are matched with
// corresponding writes to w. There is no internal buffering -
// the write must complete before the read completes.
// Any error encountered while writing is reported as a read error.
func TeeReader(r Reader, w Writer) Reader {return &teeReader{r, w}
}type teeReader struct {r Readerw Writer
}func (t *teeReader) Read(p []byte) (n int, err error) {n, err = t.r.Read(p)if n > 0 {if n, err := t.w.Write(p[:n]); err != nil {return n, err}}return
}
總結(jié):golang的io包中的這個TeeReader函數(shù)給我們提供了非常高效的文件操作的同時進行其他任務(wù)的接口,利用這個特性我們可以在保存文件的同時高效的計算文件的MD5,? 也可以利用它來實時的顯示文件操作進度條等。
更多使用方法參見??go語言內(nèi)置io包中TreeReader函數(shù)的理解和使用示例_golang io.teereader-CSDN博客