すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:オブジェクトのアップロード

最終更新日:Dec 19, 2023

このトピックでは、バージョン管理されたバケットにオブジェクトをアップロードする方法について説明します。

使用上の注意

  • このトピックでは、中国 (杭州) リージョンのパブリックエンドポイントを使用します。 OSSと同じリージョンにある他のAlibaba Cloudサービスを使用してOSSにアクセスする場合は、内部エンドポイントを使用します。 OSSでサポートされているリージョンとエンドポイントの詳細については、「リージョンとエンドポイント」をご参照ください。

  • このトピックでは、OSSエンドポイントを使用してOSSClientインスタンスを作成します。 カスタムドメイン名またはSTS (Security Token Service) を使用してOSSClientインスタンスを作成する場合は、「初期化」をご参照ください。

  • オブジェクトをアップロードするには、oss:PutObject権限が必要です。 詳細については、「RAMユーザーへのカスタムポリシーのアタッチ」をご参照ください。

簡易アップロード

バージョン管理が有効なバケットにオブジェクトをアップロードするリクエストを開始すると、アップロードされたオブジェクトに対して一意のバージョンIDが生成され、そのバージョンIDがx-OSS-version-idヘッダーの値としてレスポンスに含まれます。 バージョン管理が一時停止されたバケットにオブジェクトをアップロードすると、OSSはオブジェクトのバージョンID nullを生成します。 アップロードしたオブジェクトの名前が既存のオブジェクトと同じ場合、既存のオブジェクトはアップロードしたオブジェクトによって上書きされます。 このように、各オブジェクトは、バージョンIDがnullであるバージョンのみを有する。

次のコードは、単純アップロードを使用してバージョン管理されたバケットにオブジェクトをアップロードする方法の例を示しています。

System.Textを使用した
;
Aliyun.OSSを使用します。// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
var endpoint = "yourEndpoint";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケットの名前を指定します。 例: examplebucket. 
var bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
var objectName = "exampleobject.txt";
var objectContent = "単なるクラウドではありません。";
// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
トライ
{
    byte[] binaryData = Encoding.ASCII.GetBytes(objectContent);
    MemoryStream requestContent = new MemoryStream(binaryData);
    // ローカルファイルをアップロードします。 
    var result = client.PutObject(bucketName, objectName, requestContent);
    Console.WriteLine("Put object successed versionid : {0}", result.VersionId);
}
キャッチ (例外ex)
{
    Console.WriteLine("Put object failed, {0}", ex.Message);
} 

追加アップロード

バージョン管理が有効なバケットでは、AppendObject操作は、現在のバージョンの追加可能オブジェクトに対してのみ実行できます。

説明
  • 現在のバージョンの追加可能オブジェクトに対してAppendObject操作を実行すると、そのオブジェクトの以前のバージョンは生成されません。

  • 現在のバージョンが追加可能オブジェクトであるオブジェクトに対してPutObjectまたはDeleteObject操作を実行すると、OSSは追加可能オブジェクトを以前のバージョンとして保存し、オブジェクトがそれ以上追加されないようにします。

  • 通常のオブジェクトや削除マーカーなど、現在のバージョンが追加できないオブジェクトでは、AppendObject操作を実行できません。

次のコードは、追加アップロードを使用してバージョン管理されたバケットにオブジェクトをアップロードする方法の例を示しています。

Aliyun.OSSを使用した

// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
var endpoint = "yourEndpoint";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケットの名前を指定します。 例: examplebucket. 
var bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
var objectName = "exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
var localFilename = "D :\\ localpath\\examplefile.txt";
// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
// 追加アップロードを実行して追加可能オブジェクトを作成する場合、追加操作の開始位置は0です。 次の追加操作の位置は、応答に含まれる。 次の追加アップロードの開始位置は、オブジェクトの現在の長さです。 
ロングポジション=0;
トライ
{
    var metadata = client.GetObjectMetadata(bucketName, objectName);
    position = metadata.ContentLength;
}
catch (例外) { }
トライ
{
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        var request = new AppendObjectRequest(bucketName, objectName)
        {
            ObjectMetadata = new ObjectMetadata(),
            Content = fs,
            Position = position
        };
        // 追加操作を実行します。 
        var result = client.AppendObject(request);
        // 追加操作の開始位置を指定します。 
        position = result.NextAppendPosition;
        Console.WriteLine("Append object succeed, next append position:{0}, vesionid:{1}", position, result.VersionId);
    }
    // 次の追加操作の開始位置を照会し、2番目の追加操作を実行します。 
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        var request = new AppendObjectRequest(bucketName, objectName)
        {
            ObjectMetadata = new ObjectMetadata(),
            Content = fs,
            Position = position
        };
        var result = client.AppendObject(request);
        position = result.NextAppendPosition;
        Console.WriteLine("Append object succeed, next append position:{0}, vesionid:{1}", position, result.VersionId);
    }
}
キャッチ (例外ex)
{
    Console.WriteLine("Append object failed, {0}", ex.Message);
} 

マルチパートアップロード

CompleteMultipartUpload操作を呼び出して、バージョン管理が有効なバケット内のオブジェクトのマルチパートアップロードタスクを完了すると、OSSはオブジェクトの一意のバージョンIDを生成し、レスポンスのx-oss-version-IDヘッダーの値としてバージョンidを返します。

次のコードは、マルチパートアップロードを使用してバージョン管理されたバケットにオブジェクトをアップロードする方法の例を示しています。

Aliyun.OSSを使用した

// バケットが配置されているリージョンのエンドポイントを指定します。 たとえば、バケットが中国 (杭州) リージョンにある場合、エンドポイントをhttps://oss-cn-hangzhou.aliyuncs.comに設定します。 
var endpoint = "yourEndpoint";
// 環境変数からアクセス資格情報を取得します。 サンプルコードを実行する前に、OSS_ACCESS_KEY_IDおよびOSS_ACCESS_KEY_SECRET環境変数が設定されていることを確認してください。 
var accessKeyId = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_ID");
var accessKeySecret = Environment.GetEnvironmentVariable("OSS_ACCESS_KEY_SECRET");
// バケットの名前を指定します。 例: examplebucket. 
var bucketName = "examplebucket";
// オブジェクトのフルパスを指定します。 バケット名をフルパスに含めないでください。 例: exampledir/exampleobject.txt。 
var objectName = "exampledir/exampleobject.txt";
// ローカルファイルのフルパスを指定します。 例: D :\\ localpath\\examplefile.txt。 デフォルトでは、ローカルファイルを指定しない場合、サンプルプログラムが属するプロジェクトのパスからローカルファイルがアップロードされます。 
var localFilename = "D :\\ localpath\\examplefile.txt";
// OSSClientインスタンスを作成します。 
var client = new OssClient (エンドポイント、accessKeyId、accessKeySecret);
// マルチパートアップロードタスクを開始します。 
var uploadId = "";
トライ
{
    // アップロードするオブジェクトの名前と、オブジェクトが属するバケットを指定します。 InitiateMultipartUploadRequestメソッドでは、ContentLengthの代わりにObjectMetaを指定できます。 
    var request = new InitiateMultipartUploadRequest(bucketName, objectName);
    var result = client.InitiateMultipartUpload(request);
    uploadId = result.UploadId;
    // アップロードIDを表示します。 
    Console.WriteLine("Init multi part upload succeeded");
    Console.WriteLine("Upload Id:{0}", result.UploadId);
}
キャッチ (例外ex)
{
    Console.WriteLine("Initマルチパートアップロードに失敗しました, {0}", 例: メッセージ);
}
// 部品の総数を計算します。 
var partSize = 100*1024;
var fi = new FileInfo(localFilename);
var fileSize = fi.Length;
var partCount = fileSize / partSize;
if (fileSize % partSize != 0)
{
    partCount ++;
}
// マルチパートアップロードタスクを開始します。 partETagsはパーツETagsのリストです。 OSSは、部品リストを受信した後、各部品の有効性を検証します。  すべての部品が検証された後、OSSはこれらの部品を完全なオブジェクトに結合します。 
var partETags = newリスト <PartETag>();
トライ
{
    using (var fs = File.Open(localFilename, FileMode.Open))
    {
        for (var i = 0; i < partCount; i++)
        {
            var skipBytes = (long)partSize * i;
            // マルチパートアップロードタスクの開始位置を見つけます。 
            fs.Seek(skipBytes, 0);
            // このアップロードのパーツサイズを計算します。 最後のパーツのサイズは、オブジェクトが計算されたパーツサイズで分割された後の残りのサイズです。 
            var size = (partSize < fileSize - skipBytes) ? partSize : (fileSize - skipBytes);
            var request = new UploadPartRequest(bucketName, objectName, uploadId)
            {
                InputStream = fs,
                PartSize = size,
                PartNumber = i + 1
            };
            // UploadPartを呼び出してパーツをアップロードします。 返される結果には、部品のETag値が含まれます。 
            var result = client.UploadPart(request);
            partETags.Add(result.PartETag);
            Console.WriteLine("finish {0}/{1}", partETags.Count, partCount);
        }
        Console.WriteLine("Put multi part upload succeeded");
    }
}
キャッチ (例外ex)
{
    Console.WriteLine("Put multi part upload failed, {0}", ex.Message);
}
// マルチパートアップロードタスクを完了します。 
トライ
{
    var completeMultipartUploadRequest = new CompleteMultipartUploadRequest(bucketName, objectName, uploadId);
    foreach (var partETag in partETags)
    {
        completeMultipartUploadRequest.PartETags.Add(partETag);
    }
    var result = client.CompleteMultipartUpload(completeMultipartUploadRequest);
    Console.WriteLine("CompleteMultipartUpload successed, vesionid:{0}", result.VersionId);
}
キャッチ (例外ex)
{
    Console.WriteLine("complete multi part failed, {0}", ex.Message);
} 

参考資料

  • シンプルアップロードを実行するために呼び出すことができるAPI操作の詳細については、「PutObject」をご参照ください。

  • 追加アップロードを実行するために呼び出すことができるAPI操作の詳細については、「AppendObject」をご参照ください。

  • マルチパートアップロードを実行するために呼び出すことができるAPI操作の詳細については、「CompleteMultipartUpload」をご参照ください。