このトピックでは、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(®ion, "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)
}
シナリオ
関連情報
ダウンローダーの詳細については、「デベロッパーガイド」をご参照ください。
ファイルダウンロードの API 操作の詳細については、「DownloadFile」をご参照ください。