Go で http.Transport を使用して、大きなファイルの転送を再開するブレークポイントを実装するにはどうすればよいですか?
ネットワーク伝送プロセスでは、大容量ファイルの伝送に時間がかかることが多く、伝送の効率と安定性を向上させるために、ブレークポイント・レジューム伝送技術が一般的なソリューションになっています。 Go 言語では、http.Transport を使用して大きなファイルのブレークポイント再開転送を実装し、ネットワーク転送の安定性と信頼性を高めることができます。この記事では、http.Transport を使用してブレークポイント再開を実装する方法を紹介し、対応するコード例を示します。
まず、ネットワーク送信を担当する http.Transport オブジェクトを初期化する必要があります。 http.Transport オブジェクトのパラメーターを構成することで、送信の詳細の一部を制御できます。
transport := &http.Transport{ MaxIdleConnsPerHost: 10, DisableCompression: true, DisableKeepAlives: true, ResponseHeaderTimeout: time.Second * 5, }
上記のコードでは、アイドル接続の最大数を 10 に設定し、圧縮機能と接続を維持するオプションを無効にし、応答ヘッダーのタイムアウトを 5 秒に設定します。これらのパラメータは、実際のニーズに応じて調整できます。
次に、http.Transport オブジェクトを使用して HTTP リクエストを開始します。リクエストを開始する前に、http.Request オブジェクトを構築し、リクエストされた URL、リクエスト メソッド、リクエスト ヘッダー、およびその他の情報を指定する必要があります。
req, err := http.NewRequest("GET", "http://example.com/large_file.zip", nil) if err != nil { log.Fatal(err) } // 添加断点续传的相关请求头信息 if fileInfo, err := os.Stat("local_file.zip"); err == nil { req.Header.Set("Range", "bytes="+strconv.FormatInt(fileInfo.Size(), 10)+"-") }
上記のコードでは、http.NewRequest メソッドを使用して GET リクエストを作成し、ダウンロードする大きなファイルの URL を指定します。同時に、ダウンロードしたローカルファイルのサイズに応じて「Range」リクエストヘッダーを設定することでブレークポイント再開を実装します。
リクエストの構築が完了したら、http.Transport オブジェクトの RoundTrip メソッドを通じて HTTP リクエストを実行し、応答結果を取得できます。
resp, err := transport.RoundTrip(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() if resp.StatusCode != http.StatusPartialContent { // 如果服务器未返回部分内容,无法进行断点续传 log.Fatal("Server does not support partial content") } // 检查是否支持断点续传 contentRange := resp.Header.Get("Content-Range") if contentRange == "" { // 如果服务器未返回Content-Range头部,无法进行断点续传 log.Fatal("Server does not support content range") } // 获取已下载的文件大小 currentSize, err := getCurrentFileSize(contentRange) if err != nil { log.Fatal(err) }
上記のコードでは、まずサーバーがコンテンツの一部を返したかどうかを確認します (ステータス コードは 206)。サーバーがコンテンツの一部を返していない場合、ブレークポイントで再開可能な送信はできません。 。次に、応答ヘッダーの「Content-Range」フィールドをチェックして、サーバーが再開可能なダウンロードをサポートしているかどうかを確認します。サーバーが「Content-Range」フィールドを返さない場合、アップロードは再開されません。
前の手順が正常に完了した場合、つまりサーバーがブレークポイント再開をサポートしている場合、ファイルのダウンロードを開始して、ファイルをローカルに保存できます。
out, err := os.OpenFile("local_file.zip", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644) if err != nil { log.Fatal(err) } defer out.Close() _, err = io.Copy(out, resp.Body) if err != nil { log.Fatal(err) } // 下载完成后,检查文件完整性 fileSize, err := getFileSize(contentRange) if err != nil { log.Fatal(err) } if currentSize != fileSize { log.Fatal("Downloaded file size does not match") } fmt.Println("Download completed")
上記のコードでは、まずローカル ファイルを開いて、ダウンロードしたコンテンツを保存します。次に、応答コンテンツは io.Copy 関数を通じてローカル ファイルに書き込まれます。最後に、ダウンロードされたファイル サイズがサーバーから返されたファイル サイズと一致することを確認して、ファイルの整合性を確保します。
この時点で、http.Transport を使用して大きなファイルのブレークポイント再開転送を実装するプロセスが完了しました。上記の手順により、ネットワーク伝送時の伝送効率と安定性が向上し、大容量ファイルの安全な伝送が保証されます。
概要
この記事では、Go 言語で http.Transport を使用して、大きなファイルのブレークポイント再開転送を実装する方法を紹介します。 http.Transport オブジェクトのパラメータを適切に設定することで、アイドル接続の最大数、圧縮機能、リクエストのタイムアウトなど、送信の詳細を制御できます。同時に、ダウンロードされたファイルのサイズに応じて「Range」リクエスト ヘッダーを設定することで、ブレークポイントの再開を実装できます。最後に、io.Copy 関数を通じて応答コンテンツをローカル ファイルに書き込み、ファイルの整合性をチェックします。これらの手順は、大容量ファイル転送における転送効率と安定性を向上させ、より良いユーザー エクスペリエンスを実現するのに役立ちます。
参照コード: https://gist.github.com/anonymous/043cdf4cf58e183d08c5ad7d01c8db82
以上がhttp.Transport を使用して、Go で大きなファイルの転送を再開するブレークポイントを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。