如何在 Go HTTP POST 请求中跟踪上传进度
在使用 Go 开发适用于 Linux 的 ShareX 克隆时,需要监控通过 HTTP POST 请求发送的大文件上传进度。虽然手动打开 TCP 连接并以块的形式写入 HTTP 请求是一种选择,但这不是最有效和最可靠的解决方案。
ProgressReader:自定义 io.Reader
更有效的方法是创建一个自定义 io.Reader 来包围实际的阅读器。这个自定义阅读器名为ProgressReader,它有一个Reporter函数,每次调用Read方法时都会输出上传进度,提供实时监控。
下面是如何实现这个想法的示例:
type ProgressReader struct {
io.Reader
Reporter func(r int64)
}
func (pr *ProgressReader) Read(p []byte) (n int, err error) {
n, err = pr.Reader.Read(p)
pr.Reporter(int64(n))
return
}
然后使用此自定义阅读器来包装正在上传的文件:
file, _ := os.Open("/tmp/blah.go")
total := int64(0)
pr := &ProgressReader{file, func(r int64) {
total = r
if r > 0 {
fmt.Println("progress", r)
} else {
fmt.Println("done", r)
}
}}
最后,使用 io.Copy 将数据复制到 ioutil.Discard,它充当数据的接收器,同时仍然允许打印进度输出。
io.Copy(ioutil.Discard, pr)
该方法为 Go 中的 HTTP POST 请求提供了一种简单可靠的跟踪上传进度的方法,使用户能够实时监控大文件上传的进度。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3