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