Object Storage Service (OSS) はマルチパートアップロード機能を提供します。マルチパートアップロードを使用すると、ラージオブジェクトを複数のパートに分割してアップロードできます。これらのパートがアップロードされた後、CompleteMultipartUpload 操作を呼び出して、パートを完全なオブジェクトに結合できます。
注意事項
このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。OSS と同じリージョンにある他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用してください。OSS のリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。
このトピックでは、アクセス認証情報は環境変数から取得します。アクセス認証情報の設定方法の詳細については、「アクセス認証情報の設定」をご参照ください。
このトピックでは、OSS エンドポイントを使用して OSSClient インスタンスを作成します。カスタムドメイン名または Security Token Service (STS) を使用して OSSClient インスタンスを作成する場合は、「クライアントの設定 (Go SDK V1)」をご参照ください。
InitiateMultipartUpload、UploadPart、CompleteMultipartUpload 操作を含むマルチパートアップロードプロセスを完了するには、
oss:PutObject権限が必要です。詳細については、「RAM ユーザーへのカスタム権限の付与」をご参照ください。Go SDK V2.2.5 以降では、次のサンプルコードに含まれるすべてのプロパティがサポートされています。
マルチパートアップロードの手順
マルチパートアップロードには、次の 3 つのステップが含まれます:
マルチパートアップロードの初期化。
Bucket.InitiateMultipartUpload メソッドを呼び出します。OSS はグローバルに一意なアップロード ID を返します。
パートのアップロード。
Bucket.UploadPart メソッドを呼び出して、各パートのデータをアップロードできます。
説明同じアップロード ID の場合、パート番号はオブジェクト内でのパートの相対的な位置を示します。同じパート番号を使用して新しいデータをアップロードすると、OSS 内のそのパートの既存データは上書きされます。
OSS は、受信したパートデータの MD5 ハッシュを ETag ヘッダーで返します。
OSS はアップロードされたデータの MD5 ハッシュを計算し、SDK によって計算された MD5 ハッシュと比較します。2 つの MD5 ハッシュが一致しない場合、InvalidDigest エラーコードが返されます。
マルチパートアップロードの完了。
すべてのパートがアップロードされた後、Bucket.CompleteMultipartUpload メソッドを呼び出して、すべてのパートを完全なオブジェクトに結合できます。
サンプルコード
次のサンプルコードを使用して、完全なマルチパートアップロードを実行できます。
package main
import (
"fmt"
"log"
"os"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
)
func main() {
// 環境変数からアクセス認証情報を取得します。サンプルコードを実行する前に、OSS_ACCESS_KEY_ID および OSS_ACCESS_KEY_SECRET 環境変数が設定されていることを確認してください。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
log.Fatalf("Error: %v", err)
}
// OSSClient インスタンスを作成します。
// yourEndpoint をバケットのエンドポイントに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。他のリージョンについては、必要に応じてエンドポイントを設定してください。
// yourRegion をバケットが配置されているリージョンに設定します。たとえば、中国 (杭州) リージョンのバケットの場合、リージョンを cn-hangzhou に設定します。他のリージョンについては、必要に応じてリージョンを設定してください。
clientOptions := []oss.ClientOption{oss.SetCredentialsProvider(&provider)}
clientOptions = append(clientOptions, oss.Region("yourRegion"))
// 署名バージョンを設定します。
clientOptions = append(clientOptions, oss.AuthVersion(oss.AuthV4))
client, err := oss.New("yourEndpoint", "", "", clientOptions...)
if err != nil {
log.Fatalf("Error: %v", err)
}
// バケット名を設定します。
bucketName := "examplebucket"
// オブジェクトの完全なパスを設定します。完全なパスにバケット名を含めることはできません。
objectName := "exampleobject.txt"
// ローカルファイルの完全なパスを設定します。ローカルパスを指定しない場合、ファイルはサンプルプログラムのプロジェクトに対応するローカルパスからアップロードされます。
localFilename := "/localpath/exampleobject.txt"
bucket, err := client.Bucket(bucketName)
if err != nil {
log.Fatalf("Error: %v", err)
}
// パートサイズをバイト単位で設定します。この例では、パートサイズは 5 MB に設定されています。
partSize := int64(5 * 1024 * 1024)
// マルチパートアップロード関数を呼び出します。
if err := uploadMultipart(bucket, objectName, localFilename, partSize); err != nil {
log.Fatalf("Failed to upload multipart: %v", err)
}
}
// マルチパートアップロード関数。
func uploadMultipart(bucket *oss.Bucket, objectName, localFilename string, partSize int64) error {
// ローカルファイルをパートに分割します。
chunks, err := oss.SplitFileByPartSize(localFilename, partSize)
if err != nil {
return fmt.Errorf("failed to split file into chunks: %w", err)
}
// ローカルファイルを開きます。
file, err := os.Open(localFilename)
if err != nil {
return fmt.Errorf("failed to open file: %w", err)
}
defer file.Close()
// ステップ 1:マルチパートアップロードイベントを初期化します。
imur, err := bucket.InitiateMultipartUpload(objectName)
if err != nil {
return fmt.Errorf("failed to initiate multipart upload: %w", err)
}
// ステップ 2:パートをアップロードします。
var parts []oss.UploadPart
for _, chunk := range chunks {
part, err := bucket.UploadPart(imur, file, chunk.Size, chunk.Number)
if err != nil {
// パートのアップロードに失敗した場合は、マルチパートアップロードタスクの中止を試みます。
if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
log.Printf("Failed to abort multipart upload: %v", abortErr)
}
return fmt.Errorf("failed to upload part: %w", err)
}
parts = append(parts, part)
}
// オブジェクトのアクセス制御リスト (ACL) を private に設定します。デフォルトでは、オブジェクトの ACL はバケットから継承されます。
objectAcl := oss.ObjectACL(oss.ACLPrivate)
// ステップ 3:マルチパートアップロードを完了します。
_, err = bucket.CompleteMultipartUpload(imur, parts, objectAcl)
if err != nil {
// アップロードの完了に失敗した場合は、アップロードの中止を試みます。
if abortErr := bucket.AbortMultipartUpload(imur); abortErr != nil {
log.Printf("Failed to abort multipart upload: %v", abortErr)
}
return fmt.Errorf("failed to complete multipart upload: %w", err)
}
log.Printf("Multipart upload completed successfully.")
return nil
}
よくある質問
マルチパートアップロードイベントを中止する方法
アップロード済みのパートを一覧表示する方法
マルチパートアップロードイベントの一覧表示
関連ドキュメント
マルチパートアップロードの完全なサンプルコードについては、「GitHub の例」をご参照ください。
完全なマルチパートアップロードには 3 つの API 操作が含まれます。詳細については、次のトピックをご参照ください:
マルチパートアップロードイベントを初期化するための API 操作の詳細については、「InitiateMultipartUpload」をご参照ください。
パートをアップロードするための API 操作の詳細については、「UploadPart」をご参照ください。
マルチパートアップロードを完了するための API 操作の詳細については、「CompleteMultipartUpload」をご参照ください。
マルチパートアップロードイベントを中止するための API 操作の詳細については、「AbortMultipartUpload」をご参照ください。
アップロード済みのパートを一覧表示するための API 操作の詳細については、「ListUploadedParts」をご参照ください。
開始されたがまだ完了または中止されていない、進行中のすべてのマルチパートアップロードイベントを一覧表示するための API 操作の詳細については、「ListMultipartUploads」をご参照ください。