我用Go编写了一个文件上传器。我将文件的md5作为文件名保存到磁盘时。

解决此问题的最佳方法是什么?

我这样保存文件:

reader, _ := r.MultipartReader()
p, _ := reader.NextPart()

f, _ := os.Create("./filename") // here I need md5 as a file name
defer f.Close()

lmt := io.LimitReader(p, maxSize + 1)
written, _ := io.Copy(f, lmt)
if written > maxSize {
    os.Remove(f.Name())
}

最佳答案

这是使用io.TeeReader同时执行计算和复制的示例

https://play.golang.org/p/IJJQiaeTOBh

package main

import (
    "crypto/sha256"
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {

    var s io.Reader = strings.NewReader("some data")

    // maxSize := 4096
    // s = io.LimitReader(s, maxSize + 1)

    h := sha256.New()
    tr := io.TeeReader(s, h)
    io.Copy(os.Stdout, tr)
    fmt.Printf("\n%x", h.Sum(nil))

}
// Output:
//some data
//1307990e6ba5ca145eb35e99182a9bec46531bc54ddf656a602c780fa0240dee

和比较测试的正确性

$ echo -n "some data" | sha256sum -
1307990e6ba5ca145eb35e99182a9bec46531bc54ddf656a602c780fa0240dee  -

07-28 01:40
查看更多