追加アップロードを使用すると、既存の追加可能オブジェクトにコンテンツを追加できます。このトピックでは、OSS C# SDK を使用して追加アップロードを実行する方法について説明します。
注意事項
このトピックのサンプルコードでは、中国 (杭州) リージョン (
cn-hangzhou) を例として使用します。デフォルトでは、パブリックエンドポイントが使用されます。同じリージョン内の他の Alibaba Cloud サービスから OSS にアクセスする場合は、内部エンドポイントを使用します。OSS がサポートするリージョンとエンドポイントの詳細については、「OSS のリージョンとエンドポイント」をご参照ください。オブジェクトが存在しない場合、追加アップロード操作によって追加可能オブジェクトが作成されます。
オブジェクトが存在する場合:
オブジェクトが追加可能オブジェクトであり、指定された追加位置がオブジェクトの現在の長さと同じである場合、コンテンツはオブジェクトの末尾に追加されます。
オブジェクトが追加可能オブジェクトであっても、指定された追加位置がオブジェクトの現在の長さと同じでない場合、PositionNotEqualToLength 例外がスローされます。
オブジェクトが追加可能オブジェクトでない場合、たとえば、単純なアップロードを使用してアップロードされた通常のオブジェクトの場合、ObjectNotAppendable 例外がスローされます。
権限
デフォルトでは、Alibaba Cloud アカウントは完全な権限を持っています。Alibaba Cloud アカウント下の RAM ユーザーまたは RAM ロールは、デフォルトでは何の権限も持っていません。Alibaba Cloud アカウントまたはアカウント管理者は、RAM ポリシーまたはバケットポリシーを通じて操作権限を付与する必要があります。
API | アクション | 定義 |
AppendObject |
| この操作を呼び出して、既存のオブジェクトにオブジェクトを追加することでオブジェクトをアップロードできます。 |
| 既存のオブジェクトにオブジェクトを追加してオブジェクトをアップロードする際に、x-oss-tagging を通じてオブジェクトタグを指定する場合、この権限が必要です。 |
サンプルコード
using System.Text; // UTF-8 エンコードされた文字列などの文字エンコーディングを処理するために System.Text 名前空間をインポートします。
using OSS = AlibabaCloud.OSS.V2; // 後続の使用を簡素化するために、Alibaba Cloud OSS SDK のエイリアスを作成します。
var region = "cn-hangzhou"; // 必須。バケットが配置されているリージョンを指定します。このトピックでは、中国 (杭州) を例として使用します。リージョンを cn-hangzhou に設定します。
var bucket = "your bucket name"; // 必須。宛先バケットの名前を指定します。
var endpoint = null as string; // オプション。OSS へのアクセスに使用するエンドポイントを指定します。このトピックでは、中国 (杭州) を例として使用します。エンドポイントを https://oss-cn-hangzhou.aliyuncs.com に設定します。
var key = "your object key"; // 必須。データを追加するオブジェクトの名前を指定します。フォーマット: folder/objectName。
// OSS SDK のデフォルト設定を読み込みます。この設定は、環境変数から AccessKey などの認証情報を自動的に読み取ります。
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);
// OSS オブジェクトに追加するコンテンツの最初の部分を定義します。
var content1 = "hello,";
// OSS オブジェクトに追加するコンテンツの 2 番目の部分を定義します。
var content2 = "oss!";
// AppendObjectAsync メソッドを呼び出して、最初の追加操作を実行します。
var result1 = await client.AppendObjectAsync(new OSS.Models.AppendObjectRequest()
{
// 宛先バケットを指定します。
Bucket = bucket,
// 宛先オブジェクトの名前を指定します。
Key = key,
// 最初の追加操作では、開始位置は 0 である必要があります。
Position = 0,
Body = new MemoryStream(Encoding.UTF8.GetBytes(content1))
});
// 前の操作の終了位置から開始して、AppendObjectAsync メソッドを呼び出して 2 番目の追加操作を実行します。
var result2 = await client.AppendObjectAsync(new OSS.Models.AppendObjectRequest()
{
// 宛先バケットは変更されません。
Bucket = bucket,
// 宛先オブジェクトの名前は変更されません。
Key = key,
// 前の追加操作の終了位置から書き込みを続行します。
Position = result1.NextAppendPosition,
Body = new MemoryStream(Encoding.UTF8.GetBytes(content2))
});
// アップロード結果を出力します。
Console.WriteLine("AppendObject done"); // 操作が完了したことを示すメッセージです。
Console.WriteLine($"StatusCode: {result2.StatusCode}"); // HTTP ステータスコード。
Console.WriteLine($"RequestId: {result2.RequestId}"); // Alibaba Cloud でのトラブルシューティングに使用されるリクエスト ID。
Console.WriteLine("Response Headers:"); // 応答ヘッダー情報。
result2.Headers.ToList().ForEach(x => Console.WriteLine(x.Key + " : " + x.Value)); // すべての応答ヘッダーを走査して出力します。
Console.WriteLine($"NextAppendPosition: {result2.NextAppendPosition}"); // 次の追加操作の開始位置を出力します。参照
追加アップロードの完全なサンプルコードについては、「AppendObject.cs」をご参照ください。