首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Go中计算SHA1文件上传的MultipartForm散列

在Go中计算SHA1文件上传的MultipartForm散列
EN

Stack Overflow用户
提问于 2014-07-16 18:29:06
回答 2查看 1.4K关注 0票数 2

我正在试图计算上传文件的sha1哈希,但到目前为止,我处于死胡同。示例代码如下:

代码语言:javascript
复制
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函数的内容如下:

代码语言:javascript
复制
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“的值进行测试,它就能正常工作。

我知道我可以简单地保存文件,计算散列,然后移动文件,尽管如果可能的话,这是我不愿采取的额外步骤。我很感激你能为我提供任何帮助。

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2014-07-30 00:50:12

您可以同时将文件流到磁盘和散列函数。下面是一个粗略的例子:

备注:它确实有一个警告:在正在写入的文件上没有检查错误。这在很大程度上取决于您的文件系统。您可能会在生产代码中考虑类似于errutil的内容。

播放链接

代码语言:javascript
复制
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)
}
票数 1
EN

Stack Overflow用户

发布于 2014-07-16 19:23:49

来自http://golang.org/pkg/mime/multipart/#File

文件是访问多部分消息的文件部分的接口。其内容可以存储在内存中,也可以存储在磁盘上。如果存储在磁盘上,文件的底层具体类型将是*os.File。

因此,您确实没有传递*os.File类型,因为它在内存中。尝试接受multipart.File作为一种类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24788093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档