Download

最終更新日:2025-08-18 15:54:18

WOS Java SDK は、包括的なオブジェクトダウンロードインターフェースを提供しています。WosClient.getObject を使用してオブジェクトをダウンロードできます。

1. ストリームダウンロード

以下のコードは、ストリームダウンロードの方法を示しています。

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);

WosObject wosObject = wosClient.getObject("bucketname", "objectname");

// オブジェクトの内容を読み取る
System.out.println("Object content:");
InputStream input = wosObject.getObjectContent();
byte[] b = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
int len;
while ((len = input.read(b)) != -1) {
    bos.write(b, 0, len);
}
System.out.println(new String(bos.toByteArray()));
bos.close();
input.close();

補足:

  • WosClient.getObject は、バケット名、オブジェクトキー、オブジェクトのメタデータ、オブジェクトの入力ストリームなどを含む WosObject インスタンスを返します。
  • 入力ストリームを利用して、オブジェクトの内容をローカルファイルまたはメモリに読み取ることができます。

重要:

  • WosObject.getObjectContent から取得した入力ストリームは、必ず明示的にクローズしてリソースリークを防いでください。

2. レンジダウンロード

オブジェクトの一部のみをダウンロードしたい場合、レンジダウンロードを利用して指定した範囲のデータを取得できます。例えば、0-1000 の範囲を指定すると、バイト 0 から 1000(両端を含む)まで、合計 1001 バイト([0, 1000])が返されます。不正な範囲を指定した場合は、オブジェクト全体が返されます。以下はレンジダウンロードの例です。

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);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
// 開始位置と終了位置を指定
request.setRangeStart(0L);
request.setRangeEnd(1000L);
WosObject wosObject = wosClient.getObject(request);

// データの読み取り
byte[] buf = new byte[1024];
InputStream in = wosObject.getObjectContent();
for (int n = 0; n != -1;) {
    n = in.read(buf, 0, buf.length);
}
in.close();

補足:

  • 指定した範囲が不正(例えば負の値やファイルサイズを超えている場合)の場合、オブジェクト全体が返されます。
  • 大容量ファイルの場合、複数のレンジリクエストを並列実行することで並列ダウンロードを実現できます。詳細は ConcurrentDownloadObjectSample を参照してください。

3. 条件付きダウンロード

オブジェクトをダウンロードする際に制約条件を指定できます。条件を満たさない場合は例外が発生し、ダウンロードは失敗します。

利用可能な条件指定パラメーターは下記の通りです。

パラメータ 説明 Java SDK メソッド
If-Modified-Since 指定された日付以降に変更されていればオブジェクトの内容を返します。そうでなければ例外発生。 GetObjectRequest.setIfModifiedSince
If-Unmodified-Since 指定された日付以降に変更されていなければオブジェクトの内容を返します。そうでなければ例外発生。 GetObjectRequest.setIfUnmodifiedSince
If-Match オブジェクトの ETag が指定値と一致すれば内容を返します。そうでなければ例外発生。 GetObjectRequest.setIfMatchTag
If-None-Match オブジェクトの ETag が指定値と一致しなければ内容を返します。そうでなければ例外発生。 GetObjectRequest.setIfNoneMatchTag

補足:

  • オブジェクトの ETag は、そのデータの MD5 チェックサムです。
  • If-Unmodified-Since または If-Match を指定し、条件を満たさない場合、返される HTTP ステータスコードは 412 Precondition Failed です。
  • If-Modified-Since または If-None-Match を指定し、条件を満たさない場合、返される HTTP ステータスコードは 304 Not Modified です。

条件付きダウンロードの例

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);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
request.setRangeStart(0L);
request.setRangeEnd(1000L);
request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
WosObject wosObject = wosClient.getObject(request);

wosObject.getObjectContent().close();

4. レスポンスヘッダーの上書き

オブジェクトのダウンロード時に、特定の HTTP/HTTPS レスポンスヘッダーを上書きできます。上書き可能なヘッダーは下記の通りです。

パラメータ 説明 Java SDK メソッド
contentType Content-Type ヘッダーを上書き ObjectRepleaceMetadata.setContentType
contentLanguage Content-Language を上書き ObjectRepleaceMetadata.setContentLanguage
expires Expires ヘッダーを上書き ObjectRepleaceMetadata.setExpires
cacheControl Cache-Control ヘッダーを上書き ObjectRepleaceMetadata.setCacheControl
contentDisposition Content-Disposition を上書き ObjectRepleaceMetadata.setContentDisposition
contentEncoding Content-Encoding を上書き ObjectRepleaceMetadata.setContentEncoding

レスポンスヘッダー上書きの例

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

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

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
ObjectRepleaceMetadata replaceMetadata = new ObjectRepleaceMetadata();
replaceMetadata.setContentType("image/jpeg");
request.setReplaceMetadata(replaceMetadata);

WosObject wosObject = wosClient.getObject(request);
System.out.println(wosObject.getMetadata().getContentType());

wosObject.getObjectContent().close();

5. カスタムメタデータの取得

オブジェクトダウンロード時にユーザー定義のメタデータも取得できます。カスタムメタデータの取得例を以下に示します。

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);

// カスタムメタデータ付きでオブジェクトをアップロード
PutObjectRequest request = new PutObjectRequest("bucketname", "objectname");
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("property", "property-value");
request.setMetadata(metadata);
wosClient.putObject(request);

// オブジェクトをダウンロードしてカスタムメタデータを取得
WosObject wosObject = wosClient.getObject("bucketname", "objectname");
System.out.println(wosObject.getMetadata().getUserMetadata("property"));

wosObject.getObjectContent().close();

6. アーカイブオブジェクトのダウンロード

アーカイブストレージクラスに保存されているオブジェクトをダウンロードするには、まず WosClient.restoreObject を使用してリストアする必要があります。アーカイブオブジェクトのダウンロード方法は以下の通りです。

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);

RestoreObjectRequest request = new RestoreObjectRequest();
request.setBucketName("bucketname");
request.setObjectKey("objectname");
request.setDays(1);
wosClient.restoreObject(request);

// オブジェクトのリストア完了まで待機
Thread.sleep(60 * 6 * 1000);

// オブジェクトのダウンロード
WosObject wosObject = wosClient.getObject("bucketname", "objectname");

wosObject.getObjectContent().close();

補足:

  • WosClient.restoreObject で指定するオブジェクトはアーカイブストレージクラスである必要があります。そうでない場合、例外が発生します。