我该如何优化执行哈希操作时读取的代码,并尝试重新开始重新读取它?

时间:2019-04-26 00:26:46

标签: go

如何使它不需要文件查找?基本上,我正在做一个哈希,然后重新读取该文件。这不是最佳的。如何使用TeeReader或其他方法来优化读取块的内容,以便可以在不重复读取的情况下进行哈希和写入内容。

另外,我需要自己指定内容长度吗?

// PUT method
func (c *Client) PutFileOld(filename string, noLen bool) error {
    file, err := os.Open(filename)
    if err != nil {
        return err
    }
    defer file.Close()

    hasher := md5.New()

    if _, err := io.Copy(hasher, file); err != nil {
        log.Fatal("Could not compute MD5")
    }

    // Lazy way to go back to the beginning since the reader has consumed our bytes
    // and we have to compute the hash
    file.Seek(0, 0)

    c.MD5 = hex.EncodeToString(hasher.Sum(nil)[:16])
    log.Printf("Uploading to: %s", fmt.Sprintf("%s/%s", c.baseURL, filename))
    baseURL, err := url.Parse(fmt.Sprintf("%s/%s", c.baseURL, filename))
    if err != nil {
        return err
    }

    log.Printf("MD5: %s - file: %s\n", c.MD5, filename)
    req, err := http.NewRequest(http.MethodPut, baseURL.String(), bufio.NewReader(file))
    if err != nil {
        return err
    }
    req.Header.Set("Content-Type", "application/octet-stream")
    req.Header.Set("Content-Md5", c.MD5)
    fi, _ := file.Stat()

    // Not sure if this is needed, or if Go sets it automatically
    req.ContentLength = fi.Size()

    res, err := c.httpClient.Do(req)
    if err != nil {
        return err
    }

    dump, err := httputil.DumpResponse(res, true)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%q\n", dump)
    c.StatusCode = res.StatusCode
    defer res.Body.Close()

    return nil
}

0 个答案:

没有答案