このトピックでは、Go SDK V2 の Uploader モジュールを使用してファイルをアップロードする方法について説明します。
使用上の注意
このトピックのサンプルコードでは、中国 (杭州) リージョンのリージョン ID
cn-hangzhouを使用します。デフォルトでは、パブリックエンドポイントを使用してバケット内のリソースにアクセスします。同じリージョン内の他の Alibaba Cloud サービスを使用してバケットリソースにアクセスする場合は、内部エンドポイントを使用します。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。このトピックでは、アクセス資格情報は環境変数から取得されます。アクセス資格情報の設定方法の詳細については、「アクセス資格情報の設定」をご参照ください。
大きなファイルをアップロードするには、
oss:PutObject権限が必要です。詳細については、「RAM ユーザーへのカスタムポリシーのアタッチ」をご参照ください。
メソッド定義
アップローダーの概要
Go SDK V2 の Uploader は、基盤となる実装の詳細を隠す高レベルの操作を提供することで、ファイルのアップロードを簡素化します。
Uploader は、マルチパートアップロード操作を使用して、大きなファイルまたはストリームを複数の小さなパートに分割し、パフォーマンスを向上させるためにパートを同時にアップロードします。
Uploader は、再開可能なアップロード機能も提供します。この機能は、アップロードプロセス中に完了したパートのステータスを記録します。ネットワークの中断やプログラムの例外などの問題でファイルのアップロードが失敗した場合、次回ファイルをアップロードしようとするときに、ブレークポイントのレコードからアップロードを再開できます。
次のサンプルコードは、Uploader の使用方法を示しています。
type Uploader struct {
...
}
// 新しいアップローダーを作成します。
func (c *Client) NewUploader(optFns ...func(*UploaderOptions)) *Uploader
// ファイルストリームをアップロードします。
func (u *Uploader) UploadFrom(ctx context.Context, request *PutObjectRequest, body io.Reader, optFns ...func(*UploaderOptions)) (*UploadResult, error)
// ローカルファイルをアップロードします。
func (u *Uploader) UploadFile(ctx context.Context, request *PutObjectRequest, filePath string, optFns ...func(*UploaderOptions)) (*UploadResult, error)リクエストパラメーター
パラメーター | タイプ | 説明 |
ctx | context.Context | リクエストのコンテキスト。 |
request | *PutObjectRequest | オブジェクトをアップロードするためのリクエストパラメーター。パラメーターは PutObject 操作のものと同じです。詳細については、「PutObjectRequest」をご参照ください。 |
body | io.Reader | アップロードするストリーム。
|
filePath | string | ローカルファイルのパス。 |
optFns | ...func(*UploaderOptions) | (オプション) 構成オプション。 |
次の表に、UploaderOptions の共通パラメーターを示します。
パラメーター | タイプ | 説明 |
PartSize | int64 | パートサイズ。デフォルト値は 6 MiB です。 |
ParallelNum | int | 同時アップロードタスクの数。デフォルト値は 3 です。このパラメーターは、グローバルな同時実行数ではなく、単一の呼び出しの同時実行数の上限を指定します。 |
LeavePartsOnError | bool | アップロードが失敗したときにアップロードされたパートを保持するかどうかを指定します。デフォルトでは、アップロードされたパートは保持されません。 |
EnableCheckpoint | bool | 再開可能なアップロード機能を有効にするかどうかを指定します。デフォルトでは、この機能は無効になっています。 説明 EnableCheckpoint パラメーターは UploadFile 操作でのみ有効であり、UploadFrom 操作ではサポートされていません。 |
CheckpointDir | string | チェックポイントファイルを保存するパス。例: /local/dir/。このパラメーターは、EnableCheckpoint が true に設定されている場合にのみ有効です。 |
NewUploader を使用して Uploader をインスタンス化するときに、構成オプションを指定してアップロードの動作をカスタマイズできます。これらのオプションは、Uploader インスタンスに設定してすべてのアップロードに適用することも、個々のアップロード操作ごとに指定することもできます。
Uploader の構成パラメーターを設定する
u := client.NewUploader(func(uo *oss.UploaderOptions) { uo.PartSize = 10 * 1024 * 1024 })各アップロードリクエストの構成パラメーターを設定する
request := &oss.PutObjectRequest{Bucket: oss.Ptr("bucket"), Key: oss.Ptr("key")} result, err := u.UploadFile(context.TODO(), request, "/local/dir/example", func(uo *oss.UploaderOptions) { uo.PartSize = 10 * 1024 * 1024 })
例
次のサンプルコードを使用して、Uploader を使用してローカルファイルをバケットにアップロードできます。
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, "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, source object name required")
}
// デフォルトの構成をロードし、資格情報プロバイダーとリージョンを設定します。
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
// OSS クライアントを作成します。
client := oss.NewClient(cfg)
// アップローダーを作成します。
u := client.NewUploader()
// ローカルファイルのパスを定義します。パスを実際のローカルファイルのパスとファイル名に置き換える必要があります。
localFile := "/Users/yourLocalPath/yourFileName"
// ファイルをアップロードします。
result, err := u.UploadFile(context.TODO(),
&oss.PutObjectRequest{
Bucket: oss.Ptr(bucketName),
Key: oss.Ptr(objectName)},
localFile)
if err != nil {
log.Fatalf("failed to upload file %v", err)
}
// アップロード結果を出力します。
log.Printf("upload file result:%#v\n", result)
}
一般的なシナリオ
関連情報
アップローダーの詳細については、「開発者ガイド」をご参照ください。
大きなファイルをアップロードするために使用できる API 操作の詳細については、「UploadFrom」と「UploadFile」をご参照ください。