So verfolgen Sie den Upload-Fortschritt in Go-HTTP-POST-Anfragen
Bei der Entwicklung eines ShareX-Klons für Linux mit Go ist dies erforderlich Überwachen Sie den Fortschritt großer Datei-Uploads, die über HTTP-POST-Anfragen gesendet werden. Das manuelle Öffnen einer TCP-Verbindung und das Schreiben von HTTP-Anfragen in Blöcken ist zwar eine Option, aber nicht die effizienteste und zuverlässigste Lösung.
ProgressReader: Ein benutzerdefinierter io.Reader
Ein effektiverer Ansatz besteht darin, einen benutzerdefinierten io.Reader zu erstellen, der den eigentlichen Reader umschließt. Dieser benutzerdefinierte Reader namens ProgressReader verfügt über eine Reporter-Funktion, die den Upload-Fortschritt bei jedem Aufruf der Read-Methode ausgibt und so eine Echtzeitüberwachung ermöglicht.
Hier ist ein Beispiel für die Umsetzung dieser Idee:
<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>
Dieser benutzerdefinierte Reader wird dann verwendet, um die hochzuladende Datei zu verpacken:
<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>
Schließlich werden die Daten mit io.Copy nach ioutil.Discard kopiert, das als Senke für die Daten fungiert Dabei kann weiterhin die Fortschrittsausgabe gedruckt werden.
<code class="go">io.Copy(ioutil.Discard, pr)</code>
Diese Methode bietet eine einfache und zuverlässige Möglichkeit, den Upload-Fortschritt für HTTP-POST-Anfragen in Go zu verfolgen, sodass Benutzer den Fortschritt großer Datei-Uploads in Echtzeit überwachen können -Zeit.
Das obige ist der detaillierte Inhalt vonSo verfolgen Sie den Upload-Fortschritt in Go-HTTP-POST-Anfragen: Ein praktischer Leitfaden mit ProgressReader?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!