How to Track Upload Progress in Go HTTP POST Requests
In the development of a ShareX clone for Linux using Go, there's a need to monitor the progress of large file uploads sent via HTTP POST requests. While manually opening a TCP connection and writing HTTP requests in chunks is an option, it's not the most efficient and reliable solution.
ProgressReader: A Custom io.Reader
A more effective approach involves creating a custom io.Reader to wrap around the actual reader. This custom reader, called ProgressReader, has a Reporter function that outputs the upload progress each time the Read method is called, providing real-time monitoring.
Here's an example of how to implement this idea:
<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>
This custom reader is then used to wrap the file being uploaded:
<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>
Finally, the data is copied using io.Copy to ioutil.Discard, which acts as a sink for the data while still allowing the progress output to be printed.
<code class="go">io.Copy(ioutil.Discard, pr)</code>
This method provides a simple and reliable way to track upload progress for HTTP POST requests in Go, enabling users to monitor the progress of large file uploads in real-time.
The above is the detailed content of How to Track Upload Progress in Go HTTP POST Requests: A Practical Guide Using ProgressReader?. For more information, please follow other related articles on the PHP Chinese website!