我正在试图计算上传文件的sha1哈希,但到目前为止,我处于死胡同。示例代码如下:
err := req.ParseMultipartForm(200000)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
m := req.MultipartForm
files := m.File["Filedata"]
for i, _ := range files {
file, err := files[i].Open()
defer file.Close()
fh = getFileHash(file)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
break
}
dst, err := os.Create(baseDir+fh+".jpg")
defer dst.Close()
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
break
}
if _, err := io.Copy(dst, file); err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
break
}
}getFileHash函数的内容如下:
func getFileHash (f *os.File) string {
fstat, err := f.Stat()
if err != nil {
panic(err)
}
fSize := fstat.Size()
buf := make([]byte, fSize)
hash := sha1.New()
n, err := f.Read(buf)
if _, err := io.WriteString(hash, string(buf[:n])); err != nil {
panic(err)
}
return string(hash.Sum(nil))
}我得到了以下错误,尽管我不知道如何解决这个问题:
不能在函数参数中使用文件(multipart.File类型)作为*os.File类型:需要类型断言
如果我使用一个示例散列作为"fh“的值进行测试,它就能正常工作。
我知道我可以简单地保存文件,计算散列,然后移动文件,尽管如果可能的话,这是我不愿采取的额外步骤。我很感激你能为我提供任何帮助。
谢谢!
发布于 2014-07-30 00:50:12
您可以同时将文件流到磁盘和散列函数。下面是一个粗略的例子:
备注:它确实有一个警告:在正在写入的文件上没有检查错误。这在很大程度上取决于您的文件系统。您可能会在生产代码中考虑类似于errutil的内容。
播放链接
package main
import (
"crypto/sha1"
"fmt"
"io"
"os"
"strings"
)
func shaAndSave(src io.Reader) ([]byte, error) {
h := sha1.New()
dest, err := os.Create("tmpfile.txt")
if err != nil {
return nil, err
}
defer dest.Close()
t := io.TeeReader(src, h)
_, err = io.Copy(dest, t)
if err != nil {
return nil, err
}
return h.Sum(nil), nil
}
func main() {
src := strings.NewReader("pretend this was a file")
hashBytes, err := shaAndSave(src)
fmt.Printf("Returned %x and %v", hashBytes, err)
}发布于 2014-07-16 19:23:49
来自http://golang.org/pkg/mime/multipart/#File
文件是访问多部分消息的文件部分的接口。其内容可以存储在内存中,也可以存储在磁盘上。如果存储在磁盘上,文件的底层具体类型将是*os.File。
因此,您确实没有传递*os.File类型,因为它在内存中。尝试接受multipart.File作为一种类型。
https://stackoverflow.com/questions/24788093
复制相似问题