Comment suivre la progression du téléchargement dans les requêtes HTTP POST Go
Dans le développement d'un clone ShareX pour Linux utilisant Go, il est nécessaire de surveiller la progression des téléchargements de fichiers volumineux envoyés via des requêtes HTTP POST. Bien que l'ouverture manuelle d'une connexion TCP et l'écriture de requêtes HTTP en morceaux soient une option, ce n'est pas la solution la plus efficace et la plus fiable.
ProgressReader : un io.Reader personnalisé
Une approche plus efficace consiste à créer un io.Reader personnalisé pour envelopper le lecteur réel. Ce lecteur personnalisé, appelé ProgressReader, dispose d'une fonction Reporter qui génère la progression du téléchargement à chaque appel de la méthode Read, offrant ainsi une surveillance en temps réel.
Voici un exemple de mise en œuvre de cette idée :
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
}
Ce lecteur personnalisé est ensuite utilisé pour envelopper le fichier en cours de téléchargement :
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)
}
}}
Enfin, les données sont copiées à l'aide de io.Copy vers ioutil.Discard, qui agit comme un récepteur pour les données tout en permettant d'imprimer la progression.
io.Copy(ioutil.Discard, pr)
Cette méthode fournit un moyen simple et fiable de suivre la progression du téléchargement des requêtes HTTP POST dans Go, permettant aux utilisateurs de surveiller la progression des téléchargements de fichiers volumineux en temps réel.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3