問題:
POST を使用して Go でファイル共有アプリケーションを構築しようとしている開発者リクエストは、長時間のアップロードを必要とする大きなファイルのアップロードの進行状況を監視する際に課題に直面しています。
解決策:
進行状況追跡を備えたラップされた io.Reader:
中間 TCP 接続を利用する代わりに、実際のファイル リーダーの周囲にカスタム io.Reader ラッパーを作成するという代替アプローチもあります。これにより、Read 関数が呼び出されるたびに進行状況を追跡できます。
コードの実装:
実装例は次のとおりです:
<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>
このラッパーでは、ProgressReader 内に実際のファイル リーダーをラップします:
<code class="go">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) } }}</code>
その後、コンテンツを破棄場所にコピーすることで進行状況を追跡できます:
<code class="go">io.Copy(ioutil.Discard, pr)</code>
このメソッドによりシームレスが可能になります。 POST リクエストを使用して、大きなファイルのアップロードの進行状況を監視します。
以上がGo で大きなファイルの POST リクエストの進行状況を追跡する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。