OSS は、大きなオブジェクトを複数の部分に分割して個別にアップロードできるマルチパートアップロード機能を提供しています。すべてのパートがアップロードされた後、CompleteMultipartUploadAsync 操作を呼び出して、これらのパートを完全なオブジェクトに結合できます。
注意事項
このトピックのサンプルコードは、中国 (杭州) リージョンのリージョン ID
cn-hangzhou
を例として使用し、デフォルトでパブリックエンドポイントを使用しています。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS でサポートされているリージョンとエンドポイントのマッピングの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。マルチパートアップロードを実装するには、
oss:PutObject
権限が必要です。詳細については、「RAM ユーザーにカスタム権限を付与する」をご参照ください。
マルチパートアップロードプロセス
マルチパートアップロードを実装するには、次の手順を実行します。
マルチパートアップロードタスクを初期化します。
Client.InitiateMultipartUploadAsync メソッドを呼び出して、OSS によって作成されたグローバルに一意のアップロード ID を取得します。
パートをアップロードします。
Client.UploadPartAsync メソッドを呼び出して、パートデータをアップロードします。
説明特定のアップロード ID を使用してマルチパートアップロードタスクを実行することでアップロードされたパートの場合、パート番号はオブジェクト内の相対位置を示します。パートをアップロードし、そのパート番号を再利用して別のパートをアップロードすると、新しいパートは元のパートを上書きします。
OSS は、アップロードされた各パートの MD5 ハッシュを、レスポンスの ETag ヘッダーに含めます。
OSS は、アップロードされたデータの MD5 ハッシュを計算し、SDK によって計算された MD5 ハッシュと比較します。2 つのハッシュが異なる場合、OSS は InvalidDigest エラーコードを返します。
マルチパートアップロードタスクを完了します。
すべてのパートがアップロードされた後、Client.CompleteMultipartUploadAsync メソッドを呼び出して、これらのパートを完全なオブジェクトに結合します。
サンプルコード
次のサンプルコードは、大きなローカルファイルを複数の部分に分割し、それらの部分をバケットにアップロードしてから、これらの部分を完全なオブジェクトに結合する方法を示しています。
using OSS = AlibabaCloud.OSS.V2; // 後続の使用を簡素化するために、Alibaba Cloud OSS SDK のエイリアスを作成します
var region = "cn-hangzhou"; // 必須。バケットが配置されているリージョンを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、リージョンを cn-hangzhou に設定します
var endpoint = null as string; // オプション。OSS へのアクセスに使用するエンドポイントを指定します。たとえば、バケットが中国 (杭州) リージョンにある場合は、エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します
var bucket = "バケット名"; // 必須。バケット名を指定します
var key = "オブジェクトキー"; // 必須。アップロードするオブジェクトの名前を指定します
var partSize = 512*1024; // 必須。アップロードする各パートのサイズを指定します。この例では、各パートのサイズは 512 KB です
var filePath = "ファイルパス"; // 必須。アップロードするファイルのパスを指定します
// 環境変数から認証情報 (AccessKey など) を自動的に読み取る OSS SDK のデフォルト構成を読み込みます
var cfg = OSS.Configuration.LoadDefault();
// ID 検証に使用される認証情報に環境変数を使用するように明示的に設定します (形式: OSS_ACCESS_KEY_ID, OSS_ACCESS_KEY_SECRET)
cfg.CredentialsProvider = new OSS.Credentials.EnvironmentVariableCredentialsProvider();
// 構成にバケットリージョンを設定します
cfg.Region = region;
// エンドポイントが指定されている場合は、デフォルトのエンドポイントをオーバーライドします
if(endpoint != null)
{
cfg.Endpoint = endpoint;
}
// 構成情報を使用して OSS クライアントインスタンスを作成します
using var client = new OSS.Client(cfg);
// マルチパートアップロードを初期化します
var initResult = await client.InitiateMultipartUploadAsync(new()
{
Bucket = bucket,
Key = key
});
// アップロードするファイルを開きます
using var file = File.OpenRead(filePath);
long fileSize = file.Length;
long partNumber = 1;
// アップロードされたすべてのパートに関する情報を保存します
var uploadParts = new List<OSS.Models.UploadPart>();
// ファイルを部分的にアップロードします
for (long offset = 0; offset < fileSize; offset += partSize)
{
// 現在の部分のサイズを計算します
var size = Math.Min(partSize, fileSize - offset);
// 単一のパートをアップロードします
var upResult = await client.UploadPartAsync(new()
{
Bucket = bucket,
Key = key,
PartNumber = partNumber,
UploadId = initResult.UploadId,
Body = new OSS.IO.BoundedStream(file, offset, size)
});
// 後でアップロードを完了するために、パート情報を保存します
uploadParts.Add(new() { PartNumber = partNumber, ETag = upResult.ETag });
partNumber++;
}
// パート番号でソートします
uploadParts.Sort((left, right) => { return (left.PartNumber > right.PartNumber) ? 1 : -1; });
// マルチパートアップロードを完了します
var cmResult = await client.CompleteMultipartUploadAsync(new()
{
Bucket = bucket,
Key = key,
UploadId = initResult.UploadId,
CompleteMultipartUpload = new ()
{
Parts = uploadParts
}
});
// アップロード結果を表示します
Console.WriteLine("マルチパートアップロード完了"); // 操作が完了したことを示します
Console.WriteLine($"ステータスコード: {cmResult.StatusCode}"); // HTTP ステータスコード
Console.WriteLine($"リクエスト ID: {cmResult.RequestId}"); // リクエスト ID。Alibaba Cloud のトラブルシューティングに使用されます
Console.WriteLine("レスポンスヘッダー:"); // レスポンスヘッダー情報
cmResult.Headers.ToList().ForEach(x => Console.WriteLine(x.Key + " : " + x.Value)); // すべてのレスポンスヘッダーをトラバースして出力します
関連情報
マルチパートアップロードの完全なサンプルコードについては、「multipartUpload.cs」をご参照ください。