Как отслеживать ход загрузки в Go HTTP POST-запросы
При разработке клона ShareX для Linux с использованием Go необходимо отслеживать ход загрузки больших файлов, отправленных через HTTP-запросы POST. Хотя открытие TCP-соединения вручную и запись HTTP-запросов частями является вариантом, это не самое эффективное и надежное решение.
ProgressReader: собственный io.Reader
Более эффективный подход предполагает создание специального io.Reader, который будет охватывать реальное устройство чтения. Это пользовательское средство чтения, называемое ProgressReader, имеет функцию Reporter, которая выводит информацию о ходе загрузки каждый раз при вызове метода Read, обеспечивая мониторинг в реальном времени.
Вот пример реализации этой идеи:
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
}
Этот специальный модуль чтения затем используется для упаковки загружаемого файла:
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)
}
}}
Наконец, данные копируются с помощью io.Copy в ioutil.Discard, который действует как приемник данных, но при этом позволяет печатать выходные данные о ходе выполнения.
io.Copy(ioutil.Discard, pr)
Этот метод обеспечивает простой и надежный способ отслеживать ход загрузки HTTP POST-запросов в Go, позволяя пользователям отслеживать ход загрузки больших файлов в режиме реального времени.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3