gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:47:06 27 4
gpt4 key购买 nike

我正在编写一个网络服务器,它以 multipart/form-data 的形式接收上传的文件。我正在根据请求生成文件 sha256,但由于 Reader 接口(interface)的性质,我无法重复使用数据将文件也上传到文件管理器。这些文件可能有几百 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
}

最佳答案

您可能会使用 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 等),甚至可以将文件发送给多个写入器位置,例如:

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.

关于go - 从文件和存储文件创建 sha256 的最佳模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com