ホームページ >バックエンド開発 >Golang >Go HTTP POST リクエストでアップロードの進行状況を追跡する方法: ProgressReader を使用した実践ガイド?

Go HTTP POST リクエストでアップロードの進行状況を追跡する方法: ProgressReader を使用した実践ガイド?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-29 17:39:02945ブラウズ

How to Track Upload Progress in Go HTTP POST Requests: A Practical Guide Using ProgressReader?

Go HTTP POST リクエストでアップロードの進行状況を追跡する方法

Go を使用した Linux 用 ShareX クローンの開発では、次のことが必要です。 HTTP POST リクエスト経由で送信される大きなファイルのアップロードの進行状況を監視します。手動で TCP 接続を開いて HTTP リクエストをチャンクに書き込むことはオプションですが、最も効率的で信頼性の高いソリューションではありません。

ProgressReader: カスタム io.Reader

より効果的なアプローチには、実際のリーダーをラップするカスタム io.Reader を作成することが含まれます。 ProgressReader と呼ばれるこのカスタム リーダーには、Read メソッドが呼び出されるたびにアップロードの進行状況を出力する Reporter 関数があり、リアルタイムの監視を提供します。

このアイデアを実装する方法の例を次に示します。

<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>

このカスタム リーダーは、アップロードされるファイルをラップするために使用されます。

<code class="go">file, _ := os.Open("/tmp/blah.go")
total := int64(0)
pr := &amp;ProgressReader{file, func(r int64) {
    total += r
    if r > 0 {
        fmt.Println("progress", r)
    } else {
        fmt.Println("done", r)
    }
}}</code>

最後に、io.Copy を使用してデータが ioutil.Discard にコピーされ、データのシンクとして機能します。

<code class="go">io.Copy(ioutil.Discard, pr)</code>

このメソッドは、Go で HTTP POST リクエストのアップロードの進行状況を追跡するためのシンプルで信頼性の高い方法を提供し、ユーザーが実際に大きなファイルのアップロードの進行状況を監視できるようにします。 -時間。

以上がGo HTTP POST リクエストでアップロードの進行状況を追跡する方法: ProgressReader を使用した実践ガイド?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。