最終更新日:2025-08-27 10:06:22
WOS Java SDKは、包括的なオブジェクト管理インターフェースを提供しています。本記事では、これらのインターフェースを利用した一般的なオブジェクト管理操作について紹介します。
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"));
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"));
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);
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());
}
補足:
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);
}
}
補足:
/)は維持してください。フォルダのキーは常に "/" で終わります。ObjectListing.getObjects により現在の「フォルダ」に含まれるオブジェクトが、ObjectListing.getCommonPrefixes によりサブフォルダが返されます。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);
WOS でオブジェクトをコピーすることにより、既存オブジェクトの複製を作成できます。
WosClient.copyObject を使用してオブジェクトをコピーできます。新しいメタデータや権限の付与、条件付きコピーも可能です。
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 |
補足:
Copy-Source-If-Modified-Since と Copy-Source-If-None-Match の併用、Copy-Source-If-Unmodified-Since と Copy-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);