如何在 Go HTTP POST 请求中跟踪上传进度
在使用 Go 开发适用于 Linux 的 ShareX 克隆时,需要监控通过 HTTP POST 请求发送的大文件上传进度。虽然手动打开 TCP 连接并以块的形式写入 HTTP 请求是一种选择,但这并不是最高效、最可靠的解决方案。
ProgressReader:自定义 io.Reader
更有效的方法是创建一个自定义 io.Reader 来包围实际的阅读器。这个自定义阅读器名为 ProgressReader,有一个 Reporter 函数,每次调用 Read 方法时都会输出上传进度,提供实时监控。
下面是如何实现此想法的示例:
<code class="go">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 }</code>
然后使用此自定义读取器来包装正在上传的文件:
<code class="go">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) } }}</code>
最后,使用 io.Copy 将数据复制到 ioutil.Discard,后者充当数据的接收器同时仍然允许打印进度输出。
<code class="go">io.Copy(ioutil.Discard, pr)</code>
该方法提供了一种简单可靠的方法来跟踪 Go 中 HTTP POST 请求的上传进度,使用户能够实时监控大文件上传的进度-时间。
以上是如何跟踪 Go HTTP POST 请求中的上传进度:使用 ProgressReader 的实用指南?的详细内容。更多信息请关注PHP中文网其他相关文章!