首页 >后端开发 >Golang >如何跟踪 Go HTTP POST 请求中的上传进度:使用 ProgressReader 的实用指南?

如何跟踪 Go HTTP POST 请求中的上传进度:使用 ProgressReader 的实用指南?

Patricia Arquette
Patricia Arquette原创
2024-10-29 17:39:02950浏览

How to Track Upload Progress in Go HTTP POST Requests: A Practical Guide Using ProgressReader?

如何在 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 := &amp;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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn