「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go HTTP POST リクエストでアップロードの進行状況を追跡する方法: ProgressReader を使用した実践ガイド?

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

2024 年 11 月 4 日に公開
ブラウズ:458

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 関数があり、リアルタイムの監視を提供します。

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

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)

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3