Object Manage

最終更新日:2025-08-27 10:06:22

WOS Java SDKは、包括的なオブジェクト管理インターフェースを提供しています。本記事では、これらのインターフェースを利用した一般的なオブジェクト管理操作について紹介します。

1. オブジェクトメタデータの設定

WosClient.setObjectMetadata を使用して、カスタムユーザーメタデータを含むオブジェクトメタデータを設定できます。以下はオブジェクトメタデータの設定方法の例です。

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient インスタンスの作成
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

SetObjectMetadataRequest request = new SetObjectMetadataRequest("bucketname", "objectname");
request.addUserMetadata("property1", "property-value1");
// カスタムメタデータの設定
ObjectMetadata metadata = wosClient.setObjectMetadata(request);

System.out.println("\t" + metadata.getUserMetadata("property1"));

2. オブジェクトメタデータの取得

WosClient.getObjectMetadata を利用して、オブジェクトサイズ、MIME タイプ、カスタムユーザーメタデータなどのオブジェクトメタデータを取得できます。以下は取得例です。

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient インスタンスの作成
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

ObjectMetadata metadata = wosClient.getObjectMetadata("bucketname", "objectname");
System.out.println("\t" + metadata.getContentType());
System.out.println("\t" + metadata.getContentLength());
System.out.println("\t" + metadata.getUserMetadata("property"));

3. オブジェクト ACL の取得

WosClient.getObjectAcl を利用して、オブジェクトのアクセスコントロールリスト(ACL)を取得できます。以下は取得例です。

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient インスタンスの作成
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

AccessControlList acl = wosClient.getObjectAcl("bucketname", "objectname");
System.out.println(acl);

4. オブジェクトの一覧取得

WosClient.listObjects を利用して、バケット内のオブジェクトを一覧取得できます。

設定可能なパラメータ

パラメータ 説明 Java SDK メソッド
bucketName バケット名 ListObjectsRequest.setBucketName
prefix 指定したプレフィックスで始まる名前のオブジェクトのみを返す ListObjectsRequest.setPrefix
marker リストの開始位置を指定。マーカーより辞書順で後のオブジェクトを返す ListObjectsRequest.setMarker
maxKeys 一度に返すオブジェクト数の上限(1〜1000、1000を超える場合は自動的に1000に設定) ListObjectsRequest.setMaxKeys
delimiter オブジェクト名のグループ化区切り文字。区切り文字が含まれるオブジェクトの共通プレフィックス返却 ListObjectsRequest.setDelimiter

シンプルな一覧取得

以下の例では、1 回のリクエストで最大 1,000 件のオブジェクトを取得します。

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient インスタンスの作成
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

ObjectListing result = wosClient.listObjects("bucketname");
for (WosObject wosObject : result.getObjects()) {
    System.out.println("\t" + wosObject.getObjectKey());
    System.out.println("\t" + wosObject.getOwner());
}

補足:

  • 1 回の呼び出しで取得できる最大件数は 1,000 件です。1,000 件を超える場合、ObjectListing.isTruncated が true となります。以降のリクエストには ObjectListing.getNextMarker を使用してください。
  • 全てのオブジェクトを取得する場合は、ページネーションによる一覧取得を利用してください。

指定数のオブジェクトの一覧取得

ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
ObjectListing result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
    System.out.println("\t" + wosObject.getObjectKey());
    System.out.println("\t" + wosObject.getOwner());
}

プレフィックスによるオブジェクト一覧取得

ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
request.setPrefix("prefix");
ObjectListing result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
    System.out.println("\t" + wosObject.getObjectKey());
    System.out.println("\t" + wosObject.getOwner());
}

マーカー指定でのオブジェクト一覧取得

ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);
request.setMarker("test");
ObjectListing result = wosClient.listObjects(request);
for (WosObject wosObject : result.getObjects()) {
    System.out.println("\t" + wosObject.getObjectKey());
    System.out.println("\t" + wosObject.getOwner());
}

全オブジェクトのページネーション一覧取得

ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(100);

ObjectListing result;
do {
    result = wosClient.listObjects(request);
    for (WosObject wosObject : result.getObjects()) {
        System.out.println("\t" + wosObject.getObjectKey());
        System.out.println("\t" + wosObject.getOwner());
    }
    request.setMarker(result.getNextMarker());
} while (result.isTruncated());

「フォルダ」内すべてのオブジェクト一覧取得

WOS はフォルダ構造を持っていませんが、オブジェクトはバケット内に直接格納されます。フォルダは、キーが "/" で終わるサイズ 0 のオブジェクトとして疑似的に表現できます。フォルダ内のようにオブジェクトを一覧取得するには、フォルダのプレフィックスを指定します。

ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setPrefix("dir/");
request.setMaxKeys(1000);

ObjectListing result;
do {
    result = wosClient.listObjects(request);
    for (WosObject wosObject : result.getObjects()) {
        System.out.println("\t" + wosObject.getObjectKey());
        System.out.println("\t" + wosObject.getOwner());
    }
    request.setMarker(result.getNextMarker());
} while (result.isTruncated());

ディレクトリ単位(グループ化)でのオブジェクト一覧取得

ListObjectsRequest request = new ListObjectsRequest("bucketname");
request.setMaxKeys(1000);
// 区切り文字 "/" を指定
request.setDelimiter("/");
ObjectListing result = wosClient.listObjects(request);
System.out.println("Objects in the root directory:");
for (WosObject wosObject : result.getObjects()) {
    System.out.println("\t" + wosObject.getObjectKey());
    System.out.println("\t" + wosObject.getOwner());
}
listObjectsByPrefix(wosClient, request, result);

static void listObjectsByPrefix(WosClient wosClient, ListObjectsRequest request, ObjectListing result) throws WosException {
    for (String prefix : result.getCommonPrefixes()) {
        System.out.println("Objects in folder [" + prefix + "]:");
        request.setPrefix(prefix);
        result = wosClient.listObjects(request);
        for (WosObject wosObject : result.getObjects()) {
            System.out.println("\t" + wosObject.getObjectKey());
            System.out.println("\t" + wosObject.getOwner());
        }
        listObjectsByPrefix(wosClient, request, result);
    }
}

補足:

  • 上記コードは、1 つのフォルダ内にオブジェクトが 1,000 件を超える場合には対応していません。
  • オブジェクトとサブフォルダを再帰的に一覧取得する目的のため、再帰呼び出しごとに区切り文字(/)は維持してください。フォルダのキーは常に "/" で終わります。
  • 各再帰で ObjectListing.getObjects により現在の「フォルダ」に含まれるオブジェクトが、ObjectListing.getCommonPrefixes によりサブフォルダが返されます。

5. オブジェクトの削除

単一オブジェクトの削除

WosClient.deleteObject を使って単一のオブジェクトを削除します。

WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);
wosClient.deleteObject("bucketname", "objectname");

バッチ削除

WosClient.deleteObjects を利用して 1 回のリクエストで最大 1,000 件のオブジェクトを削除できます。

WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

DeleteObjectsRequest deleteRequest = new DeleteObjectsRequest("bucketname");
wosClient.deleteObjects(deleteRequest);

6. オブジェクトのコピー

WOS でオブジェクトをコピーすることにより、既存オブジェクトの複製を作成できます。

WosClient.copyObject を使用してオブジェクトをコピーできます。新しいメタデータや権限の付与、条件付きコピーも可能です。

制限事項

  • コピー元オブジェクトへの読み取り権限が必要です。
  • リージョン間コピーはサポートされていません。
  • コピー元オブジェクトサイズは 5GB 以下である必要があります(1GB 未満なら単純コピー推奨、それ以上はマルチパートコピー推奨)。
  • アーカイブオブジェクトは、コピー前にリストアされている必要があります。

単純コピー

WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

try {
    CopyObjectResult result = wosClient.copyObject("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
    System.out.println("\t" + result.getStatusCode());
    System.out.println("\t" + result.getEtag());
} catch (WosException e) {
    // コピー失敗時
    System.out.println("HTTP Code: " + e.getResponseCode());
    System.out.println("Error Code: " + e.getErrorCode());
    System.out.println("Error Message: " + e.getErrorMessage());
    System.out.println("Request ID: " + e.getErrorRequestId());
    System.out.println("Host ID: " + e.getErrorHostId());
}

コピー時にメタデータ上書き

WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");
// メタデータ上書きを有効化
request.setReplaceMetadata(true);
ObjectMetadata newObjectMetadata = new ObjectMetadata();
newObjectMetadata.setContentType("image/jpeg");
newObjectMetadata.addUserMetadata("property", "property-value");
newObjectMetadata.setObjectStorageClass(StorageClassEnum.WARM);
request.setNewObjectMetadata(newObjectMetadata);
CopyObjectResult result = wosClient.copyObject(request);
System.out.println("\t" + result.getEtag());

補足:

  • CopyObjectRequest.setReplaceMetadata(true).setNewObjectMetadata を併用してください。

条件付きコピー

1 つまたは複数の条件を指定し、すべての条件が満たされた場合のみコピーが実行されます。

パラメータ 説明 Java SDK メソッド
Copy-Source-If-Modified-Since コピー元のオブジェクトが指定日時以降に更新されていればコピー、そうでなければ例外発生 CopyObjectRequest.setIfModifiedSince
Copy-Source-If-Unmodified-Since コピー元のオブジェクトが指定日時以降に更新されていなければコピー、そうでなければ例外発生 CopyObjectRequest.setIfUnmodifiedSince
Copy-Source-If-Match コピー元オブジェクトの ETag が指定値と一致すればコピー、そうでなければ例外発生 CopyObjectRequest.setIfMatchTag
Copy-Source-If-None-Match コピー元オブジェクトの ETag が指定値と一致しなければコピー、そうでなければ例外発生 CopyObjectRequest.setIfNoneMatchTag

補足:

  • コピー元オブジェクトの ETag はオブジェクトの MD5 値です。
  • 条件が満たされない場合は HTTP 412 Precondition Failed が返ります。
  • Copy-Source-If-Modified-SinceCopy-Source-If-None-Match の併用、Copy-Source-If-Unmodified-SinceCopy-Source-If-Match の併用が可能です。

WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

CopyObjectRequest request = new CopyObjectRequest("sourcebucketname", "sourceobjectname", "destbucketname", "destobjectname");

request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
request.setIfNoneMatchTag("none-match-etag");

CopyObjectResult result = wosClient.copyObject(request);
System.out.println("\t" + result.getEtag());

マルチパートコピー

マルチパートコピーは、既存オブジェクトの一部をコピーしてマルチパートアップロードする特別なケースです。WosClient.copyPart を利用して実施します。大容量ファイルの場合のマルチパートコピー例を以下に示します。

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

final String destBucketName = "destbucketname";
final String destObjectKey = "destobjectname";
final String sourceBucketName = "sourcebucketname";
final String sourceObjectKey = "sourceobjectname";

// WosClient インスタンスの作成
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

// スレッドプールの初期化
ExecutorService executorService = Executors.newFixedThreadPool(20);

// マルチパートアップロードの開始
InitiateMultipartUploadRequest request = new InitiateMultipartUploadRequest(destBucketName, destObjectKey);
InitiateMultipartUploadResult result = wosClient.initiateMultipartUpload(request);

final String uploadId = result.getUploadId();
System.out.println("\t" + uploadId + "\n");

// コピー元オブジェクト情報の取得
ObjectMetadata metadata = wosClient.getObjectMetadata(sourceBucketName, sourceObjectKey);
// 1パートあたり100MBで分割
long partSize = 100 * 1024 * 1024L;
long objectSize = metadata.getContentLength();

// パート数算出
long partCount = objectSize % partSize == 0 ? objectSize / partSize : objectSize / partSize + 1;

final List<PartEtag> partEtags = Collections.synchronizedList(new ArrayList<PartEtag>());

// 並列でのパートコピー
for (int i = 0; i < partCount; i++) {
    // 各パートのレンジ
    final long rangeStart = i * partSize;
    final long rangeEnd = (i + 1 == partCount) ? objectSize - 1 : rangeStart + partSize - 1;
    final int partNumber = i + 1;
    executorService.execute(new Runnable() {
        @Override
        public void run() {
            CopyPartRequest request = new CopyPartRequest();
            request.setUploadId(uploadId);
            request.setSourceBucketName(sourceBucketName);
            request.setSourceObjectKey(sourceObjectKey);
            request.setDestinationBucketName(destBucketName);
            request.setDestinationObjectKey(destObjectKey);
            request.setByteRangeStart(rangeStart);
            request.setByteRangeEnd(rangeEnd);
            request.setPartNumber(partNumber);
            CopyPartResult result;
            try {
                result = wosClient.copyPart(request);
                System.out.println("Part#" + partNumber + " done\n");
                partEtags.add(new PartEtag(result.getEtag(), result.getPartNumber()));
            } catch (WosException e) {
                e.printStackTrace();
            }
        }
    });
}

// 完了まで待機
executorService.shutdown();
while (!executorService.isTerminated()) {
    try {
        executorService.awaitTermination(5, TimeUnit.SECONDS);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

// マルチパートアップロードの完了
CompleteMultipartUploadRequest completeMultipartUploadRequest = new CompleteMultipartUploadRequest(destBucketName, destObjectKey, uploadId, partEtags);
wosClient.completeMultipartUpload(completeMultipartUploadRequest);