すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:ダウンローダー (Go SDK V2)

最終更新日:Nov 09, 2025

このトピックでは、Go SDK V2 の新機能である Downloader モジュールを使用してファイルをダウンロードする方法について説明します。

使用上の注意

  • このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID cn-hangzhou を使用します。デフォルトでは、パブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud プロダクトから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイント間のマッピングの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックの例では、環境変数からアクセス資格情報を読み取ります。アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。

  • ファイルをダウンロードするには、oss:GetObject 権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。

メソッドの定義

Downloader の特徴

Downloader は、Go SDK V2 の新機能で、汎用的なダウンロード操作を提供します。基盤となる操作の実装詳細を抽象化し、ファイルをダウンロードするための便利な方法を提供します。

  • Downloader は、範囲のダウンロードを使用してファイルを自動的に小さなパートに分割し、これらのパートを同時にダウンロードしてダウンロードパフォーマンスを向上させます。

  • Downloader は、再開可能なダウンロード機能も提供します。ダウンロードプロセス中に、完了したパートのステータスが記録されます。ネットワークの中断や予期しないプログラムの終了などの問題でファイルのダウンロードが失敗した場合、ブレークポイントレコードからダウンロードを再開できます。

Downloader の一般的なメソッドは次のとおりです。

type Downloader struct {
  ...
}

// 新しいダウンローダーを作成します。
func (c *Client) NewDownloader(optFns ...func(*DownloaderOptions)) *Downloader

// ファイルをダウンロードします。
func (d *Downloader) DownloadFile(ctx context.Context, request *GetObjectRequest, filePath string, optFns ...func(*DownloaderOptions)) (result *DownloadResult, err error)

リクエストパラメーター

パラメーター

タイプ

説明

ctx

context.Context

リクエストのコンテキスト。このパラメーターを使用して、リクエストの合計タイムアウト期間を設定できます。

request

*GetObjectRequest

特定の API 操作のリクエストパラメーター。詳細については、「GetObjectRequest」をご参照ください。

filePath

string

ローカルファイルのパス。

optFns

...func(*DownloaderOptions)

(オプション) 構成オプション。

次の表に、DownloaderOption の共通パラメーターを示します。

パラメーター

タイプ

説明

PartSize

int64

パートサイズ。デフォルト値は 6 MiB です。

ParallelNum

int

同時ダウンロードタスクの数。デフォルト値は 3 です。このパラメーターは、単一の呼び出しの同時実行数制限を指定するものであり、グローバルな同時実行数制限ではありません。

EnableCheckpoint

bool

再開可能なダウンロード情報を記録するかどうかを指定します。デフォルトでは、この機能は無効になっています。

CheckpointDir

string

レコードファイルが保存されるパス。例: /local/dir/。このパラメーターは、EnableCheckpoint が true に設定されている場合にのみ有効になります。

VerifyData

bool

ダウンロードが再開されたときに、ダウンロードされたデータの CRC-64 値を検証するかどうかを指定します。デフォルトでは、CRC-64 値は検証されません。このパラメーターは、EnableCheckpoint が true に設定されている場合にのみ有効になります。

UseTempFile

bool

ダウンロードに一時ファイルを使用するかどうかを指定します。デフォルトでは、一時ファイルが使用されます。ファイルは最初に一時ファイルにダウンロードされます。ダウンロードが成功すると、一時ファイルはオブジェクトファイルにリネームされます。

Downloader インスタンスをインスタンス化するときに、構成オプションを指定して、そのデフォルトのダウンロード動作をカスタマイズできます。また、各ダウンロード操作に構成オプションを指定して、特定のダウンロードの動作をカスタマイズすることもできます。

  • Downloader の構成パラメーターを設定します。

    d := client.NewDownloader(func(do *oss.DownloaderOptions) {
      do.PartSize = 10 * 1024 * 1024
    })
  • 各ダウンロードリクエストの構成パラメーターを設定します。

    request := &oss.GetObjectRequest{Bucket: oss.Ptr("bucket"), Key: oss.Ptr("key")}
    d.DownloadFile(context.TODO(), request, "/local/dir/example", func(do *oss.DownloaderOptions) {
      do.PartSize = 10 * 1024 * 1024
    })

サンプルコード

次のコードを使用して、バケットからローカルデバイスにファイルをダウンロードできます。

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region     string // ストレージリージョン。
	bucketName string // バケット名。
	objectName string // オブジェクト名。
)

// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "src-object", "", "The name of the source object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// ソースオブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, src object name required")
	}

	// OSS クライアントを構成します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// ダウンローダーを作成します。
	d := client.NewDownloader()

	// オブジェクトを取得するリクエストを構築します。
	request := &oss.GetObjectRequest{
		Bucket: oss.Ptr(bucketName), // バケット名。
		Key:    oss.Ptr(objectName), // オブジェクト名。
	}

	// ローカルファイルのパスを定義します。
	localFile := "local-file"

	// リクエストを実行してファイルをダウンロードします。
	result, err := d.DownloadFile(context.TODO(), request, localFile)
	if err != nil {
		log.Fatalf("failed to download file %v", err)
	}

	// 成功メッセージを出力します。
	log.Printf("download file %s to local-file successfully, size: %d", objectName, result.Written)
}

シナリオ

ダウンローダーを使用してパートサイズと同時実行数を設定する

次のコードは、DownloaderOptions パラメーターを使用してパートサイズと同時実行数を設定する方法を示しています。

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region     string // ストレージリージョン。
	bucketName string // バケット名。
	objectName string // オブジェクト名。
)

// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "src-object", "", "The name of the source object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// ソースオブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, src object name required")
	}

	// OSS クライアントを構成します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// ダウンローダーを作成します。
	d := client.NewDownloader()

	// オブジェクトを取得するリクエストを構築します。
	request := &oss.GetObjectRequest{
		Bucket: oss.Ptr(bucketName), // バケット名。
		Key:    oss.Ptr(objectName), // オブジェクト名。
	}

	// ローカルファイルのパスを定義します。
	localFile := "local-file"

	// ダウンローダーの構成パラメーターを設定します。
	downloaderOptions := func(do *oss.DownloaderOptions) {
		do.PartSize = 20 * 1024 * 1024 // パートサイズを 20 MiB に指定します。
		do.ParallelNum = 6            // 同時ダウンロードタスクの数を 6 に指定します。
	}

	// リクエストを実行してファイルをダウンロードします。
	result, err := d.DownloadFile(context.TODO(), request, localFile, downloaderOptions)
	if err != nil {
		log.Fatalf("failed to download file %v", err)
	}

	// 成功メッセージを出力します。
	log.Printf("download file %s to local-file successfully, size: %d", objectName, result.Written)
}

ダウンローダーを使用して再開可能なダウンロード機能を有効にする

次のコードは、DownloaderOptions パラメーターを使用して再開可能なダウンロード機能を有効にする方法を示しています。

package main

import (
	"context"
	"flag"
	"log"

	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
	"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
)

// グローバル変数を定義します。
var (
	region     string // ストレージリージョン。
	bucketName string // バケット名。
	objectName string // オブジェクト名。
)

// init 関数は、コマンドラインパラメーターを初期化するために使用されます。
func init() {
	flag.StringVar(&region, "region", "", "The region in which the bucket is located.")
	flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.")
	flag.StringVar(&objectName, "src-object", "", "The name of the source object.")
}

func main() {
	// コマンドラインパラメーターを解析します。
	flag.Parse()

	// バケット名が空かどうかを確認します。
	if len(bucketName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, bucket name required")
	}

	// リージョンが空かどうかを確認します。
	if len(region) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, region required")
	}

	// ソースオブジェクト名が空かどうかを確認します。
	if len(objectName) == 0 {
		flag.PrintDefaults()
		log.Fatalf("invalid parameters, src object name required")
	}

	// OSS クライアントを構成します。
	cfg := oss.LoadDefaultConfig().
		WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
		WithRegion(region)

	// OSS クライアントを作成します。
	client := oss.NewClient(cfg)

	// ダウンローダーを作成します。
	d := client.NewDownloader()

	// オブジェクトを取得するリクエストを構築します。
	request := &oss.GetObjectRequest{
		Bucket: oss.Ptr(bucketName), // バケット名。
		Key:    oss.Ptr(objectName), // オブジェクト名。
	}

	// ローカルファイルのパスを定義します。
	localFile := "local-file"

	// ダウンローダーオプションを設定します。
	downloaderOptions := func(do *oss.DownloaderOptions) {
		do.EnableCheckpoint = true        // 再開可能なダウンロード情報の記録を有効にします。
		do.CheckpointDir = "./checkpoint" // 再開可能なダウンロード情報が格納されるディレクトリを指定します。
		do.UseTempFile = true             // ダウンロードに一時ファイルを使用します。
	}

	// リクエストを実行してファイルをダウンロードします。
	result, err := d.DownloadFile(context.TODO(), request, localFile, downloaderOptions)
	if err != nil {
		log.Fatalf("failed to download file %v", err)
	}

	// 成功メッセージを出力します。
	log.Printf("download file %s to local-file successfully, size: %d", objectName, result.Written)
}

関連情報

  • ダウンローダーの詳細については、「デベロッパーガイド」をご参照ください。

  • ファイルダウンロードの API 操作の詳細については、「DownloadFile」をご参照ください。