ホームページ  >  記事  >  バックエンド開発  >  Go で POST リクエストのアップロードの進行状況を追跡する方法は?

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

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-30 22:11:03514ブラウズ

 How to Track Upload Progress for POST Requests in Go?

Go で POST リクエストのアップロード進行状況追跡を実現

HTTP POST 経由でファイルをシームレスにアップロードする Linux 用 ShareX クローンを作成するという探求において特に転送に数分かかる可能性のある大きなファイルの場合、アップロードの進行状況を効果的に追跡するにはどうすればよいですか?

手動で TCP 接続を確立し、HTTP リクエストをチャンクで送信することは実行可能なソリューションですが、 HTTPS サイトを扱う場合には制限があり、最も効率的なアプローチではない可能性があります。幸いなことに、Go はリクエスト プロセスに進行状況の追跡を簡単に統合する代替手段を提供します。

進行状況モニタリングのための io.Reader のカスタマイズ

重要な洞察は、カスタム IO の作成にあります。実際のリーダーをラップする .Reader。 Read() メソッドをオーバーライドすることで、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
}

この構造では、Reporter読み取ったバイト数を引数として受け取るコールバック関数です。次に、ProgressReader は Read 操作をインターセプトし、進行状況をコールバックに報告します。

実際の実装

この概念を実践するには、次の操作を行います。次の手順を使用できます:

  1. ProgressReader のインスタンスを作成し、ファイル リーダーをラップします:

    file, _ := os.Open("/tmp/blah.go")
    pr := &ProgressReader{file, func(r int64) { ... }}
  2. 処理する Reporter 関数を定義します。進行状況の更新:

    pr.Reporter = func(r int64) {
        total += r
        if r > 0 {
            fmt.Println("progress", r)
        } else {
            fmt.Println("done", r)
        }
    }
  3. カスタム リーダーを使用してファイル コピーを実行します:

    io.Copy(ioutil.Discard, pr)

このアプローチを利用すると、簡単に次のことができます。 Go で POST リクエストのアップロードの進行状況を監視し、ファイル転送プロセスに関するリアルタイムの洞察をユーザーに提供します。

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

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