ホームページ  >  記事  >  バックエンド開発  >  http.Transport を使用して、Go で大きなファイルの転送を再開するブレークポイントを実装するにはどうすればよいですか?

http.Transport を使用して、Go で大きなファイルの転送を再開するブレークポイントを実装するにはどうすればよいですか?

王林
王林オリジナル
2023-07-22 19:40:501041ブラウズ

Go で http.Transport を使用して、大きなファイルの転送を再開するブレークポイントを実装するにはどうすればよいですか?

ネットワーク伝送プロセスでは、大容量ファイルの伝送に時間がかかることが多く、伝送の効率と安定性を向上させるために、ブレークポイント・レジューム伝送技術が一般的なソリューションになっています。 Go 言語では、http.Transport を使用して大きなファイルのブレークポイント再開転送を実装し、ネットワーク転送の安定性と信頼性を高めることができます。この記事では、http.Transport を使用してブレークポイント再開を実装する方法を紹介し、対応するコード例を示します。

  1. http.Transport の初期化

まず、ネットワーク送信を担当する http.Transport オブジェクトを初期化する必要があります。 http.Transport オブジェクトのパラメーターを構成することで、送信の詳細の一部を制御できます。

transport := &http.Transport{
    MaxIdleConnsPerHost:   10,
    DisableCompression:    true,
    DisableKeepAlives:     true,
    ResponseHeaderTimeout: time.Second * 5,
}

上記のコードでは、アイドル接続の最大数を 10 に設定し、圧縮機能と接続を維持するオプションを無効にし、応答ヘッダーのタイムアウトを 5 秒に設定します。これらのパラメータは、実際のニーズに応じて調整できます。

  1. HTTP リクエストの開始

次に、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」リクエストヘッダーを設定することでブレークポイント再開を実装します。

  1. HTTP リクエストの実行

リクエストの構築が完了したら、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」フィールドを返さない場合、アップロードは再開されません。

  1. ファイルのダウンロード

前の手順が正常に完了した場合、つまりサーバーがブレークポイント再開をサポートしている場合、ファイルのダウンロードを開始して、ファイルをローカルに保存できます。

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 サイトの他の関連記事を参照してください。

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