Como rastrear o progresso do upload em solicitações HTTP POST Go
No desenvolvimento de um clone do ShareX para Linux usando Go, é necessário monitore o progresso de uploads de arquivos grandes enviados por meio de solicitações HTTP POST. Embora abrir manualmente uma conexão TCP e escrever solicitações HTTP em pedaços seja uma opção, não é a solução mais eficiente e confiável.
ProgressReader: A Custom io.Reader
Uma abordagem mais eficaz envolve a criação de um io.Reader personalizado para envolver o leitor real. Esse leitor personalizado, chamado ProgressReader, possui uma função Reporter que exibe o progresso do upload cada vez que o método Read é chamado, fornecendo monitoramento em tempo real.
Aqui está um exemplo de como implementar essa ideia:
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
}
Este leitor personalizado é então usado para agrupar o arquivo que está sendo carregado:
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)
}
}}
Finalmente, os dados são copiados usando io.Copy para ioutil.Discard, que atua como um coletor para os dados enquanto ainda permite que a saída do progresso seja impressa.
io.Copy(ioutil.Discard, pr)
Este método fornece uma maneira simples e confiável de rastrear o progresso do upload para solicitações HTTP POST no Go, permitindo que os usuários monitorem o progresso de uploads de arquivos grandes em tempo real.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3