如何在golang中跟踪上传进度

7
我正在试图追踪GOLANG中的上传进度,目前我得到了这个结果。
func Upload(w http.ResponseWriter, req *http.Request) {

    mr, err := req.MultipartReader()
    if err != nil {
        return
    }

    for {
        // var part *multipart.Part
        part, err := mr.NextPart()
        mr.partsRead

        if err == io.EOF {
            break
        }
        println(part)

    }

}

问题是如何跟踪上传进度。上面的代码不起作用,我只能得到文件的一部分。谢谢。 - thesyncim
笑。你指的是哪个“控制台”?我有十几个 :) - alex
很高兴为您服务,@alex :) 但这不是重点... 我只想在服务器端跟踪上传进度。 - thesyncim
1个回答

8

这个方案可行,使用一个来计算已读取的字节数和总进度。你需要将指向某处,在本代码示例中,我将其指向了一个文件。

func Upload(w http.ResponseWriter, req *http.Request) {

    mr, err := req.MultipartReader()
    if err != nil {
        return
    }
    length := req.ContentLength
    for {

        part, err := mr.NextPart()
        if err == io.EOF {
            break
        }
        var read int64
        var p float32
        dst, err := os.OpenFile("dstfile", os.O_WRONLY|os.O_CREATE, 0644)
        if err != nil {
            return
        }
        for {
            buffer := make([]byte, 100000)
            cBytes, err := part.Read(buffer)
            if err == io.EOF {
                break
            }
            read = read + int64(cBytes)
            //fmt.Printf("read: %v \n",read )
            p = float32(read) / float32(length) *100
            fmt.Printf("progress: %v \n",p )
            dst.Write(buffer[0:cBytes])
        }
    }
}

谢谢你的回答!那段代码不起作用,我仍然只能收到文件的一部分。 - thesyncim
这个已经被纠正的版本现在已经测试并且可以工作,但需要注意的是没有进行MIME类型检查等相关操作。 - fmt.Println.MKO
@transistor09 这是一个无效的编辑。如果您认为存在技术上的不准确之处,那么您应该留下评论或者自己回答。 - Ashley Medway
@fmt.Println.MKO dst.Write(buffer) 应该替换为 dst.Write(buffer[0:cBytes]),以切掉尚未接收的额外尾随字节,否则它们会被写入每个部分。buffer 的初始化也可以移动到 for 外面,以避免重复的重新分配和垃圾回收。 - transistor09

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接