从文件和存储文件创建sha256的最佳模式

时间:2018-11-02 07:14:42

标签: go

我正在编写一个Web服务器,该服务器以multipart/form-data的形式接收文件作为上载。我正在根据请求生成文件sha256,但是由于Reader接口的性质,我无法重用数据来将文件上传到文件管理器。这些文件可以是几百个MB。存储内容的最佳方法是什么?我可以复制内容,但担心会浪费内存资源。

编辑

func uploadFile(w http.ResponseWriter, r *http.Request) {
    f, err := r.MultipartForm.File["capture"][0].Open()
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
    defer f.Close()
    hash, err := createSha(f)
    if err != nil {
        fmt.Println(err.Error())
        return
    }
}

func createSha(image multipart.File) (hash.Hash, error) {
    sha := sha256.New()
    // This cause the contents of image to no longer be available to be read again to be stored on the filer
    if _, err := io.Copy(sha, image); err != nil {
        return nil, err
    }
    return sha, nil
}

1 个答案:

答案 0 :(得分:1)

您可以使用io.MultiWriter(...)将数据同时发送到多个输出流,例如哈希和某些远程写入器。

例如(大致):

sha := sha256.New()
filer := filer.New(...) // Some Writer that stores the bytes for you?
err := io.Copy(io.MultiWriter(sha, filer), r)
// TODO: handle error
// Now sha.Sum(nil) has the file digest and "filer" got sent all the bytes.

请注意,io.Multiwriter可以容纳任意数量的作者,因此您可以同时计算其他哈希(例如md5,sha1等),甚至可以将文件发送到多个位置,例如:< / p>

md5, sha1, sha256, sha512 := md5.New(), sha1.New(), sha256.New(), sha512.New()
s3Writer, gcsWriter := filer.NewS3Writer(), filer.NewGCSWriter()
mw := io.MultiWriter(awsWriter, gcsWriter, md5, sha1, sha256, sha512)
err := io.Copy(mw, r)
// TODO: handle error
// Now you've got all the hashes for the file and it's stored in the cloud.