我正在编写一个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
}
答案 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.