[Cloud Storage API(V2)] Javaでオブジェクトをダウンロードする

Cloud Storage API V2(Java)を使用して、
Cloud Storageのオブジェクトをダウンロードする方法
についてご紹介します。

:::note info
APIを利用する環境の準備から始める場合や、コードを実行する際は、
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d)
を参照ください。
:::

|No|||目次|
|---|---|---|---|
|1|||[オブジェクトをダウンロード](#1-オブジェクトをダウンロード)|
||1||[スコープ](#11-スコープ)|
||2||[実行](#12-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|
|2|||[メタデータをダウンロード](#2-メタデータをダウンロード)|
||1||[スコープ](#21-スコープ)|
||2||[実行](#22-実行)|
||3||[レスポンスの内容](#13-レスポンスの内容)|

## 1. オブジェクトをダウンロード
指定したオブジェクトをダウンロードします。

### 1.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
StorageScopes.CLOUD_PLATFORM
StorageScopes.CLOUD_PLATFORM_READ_ONLY
StorageScopes.DEVSTORAGE_FULL_CONTROL
StorageScopes.DEVSTORAGE_READ_ONLY
StorageScopes.DEVSTORAGE_READ_WRITE
```
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う(2.2 Storageインスタンスを取得)](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d#22-storageインスタンスを取得)
でスコープを指定してください。

### 1.2. 実行

```java
public static void main(String[] args) throws Exception{
    Storage storage = getStorage();
    Storage.Objects objects = storage.objects();
    
    Storage.Objects.Get get = objects.get("バケットID","オブジェクト名");
    
    try(OutputStream outputStream = new FileOutputStream(new File("ファイルパス"), false)){
        get.executeMediaAndDownloadTo(outputStream);
    }
}
```
#### 1.2.1. HTTPリクエスト
GET： https:\//storage.googleapis.com/storage/v1/b/{バケットID}/o/{オブジェクト名}
が実行されます。

#### 1.2.2. クエリパラメータ
alt=media

### 1.3. レスポンスの内容
指定したファイルパスにオブジェクトがダウンロードされます。

## 2. メタデータをダウンロード
指定したオブジェクトのメタデータをJSON形式でダウンロードします。

### 2.1. スコープ
このAPIを実行するには、以下のいずれかのスコープを指定してください。
```
StorageScopes.CLOUD_PLATFORM
StorageScopes.CLOUD_PLATFORM_READ_ONLY
StorageScopes.DEVSTORAGE_FULL_CONTROL
StorageScopes.DEVSTORAGE_READ_ONLY
StorageScopes.DEVSTORAGE_READ_WRITE
```
[⧉[Cloud Storage API(V2)] JavaでCloud Storageを使う(2.2 Storageインスタンスを取得)](https://qiita.com/doran/items/2a5f7ef8070fd5b8c94d#22-storageインスタンスを取得)
でスコープを指定してください。

### 2.2. 実行
```java
public static void main(String[] args) throws Exception{
    Storage.Objects objects = storage.objects();
    
    Storage.Objects.Get get = objects.get("バケットID","オブジェクト名");
    
    try(OutputStream outputStream = new FileOutputStream(new File("ファイルパス"), false)){
       get.executeAndDownloadTo(outputStream);
    }
}
```
#### 2.2.1. HTTPリクエスト
GET： https:\//storage.googleapis.com/storage/v1/b/{バケットID}/o/{オブジェクト名}
が実行されます。

#### 2.2.2. クエリパラメータ
クエリパラメータはありません。

### 2.3. レスポンスの内容

JSONファイルがダウンロードされます。

|キー|型|説明|
|---|---|---|
|id|String|オブジェクトID|
|kind|String|リソースの種類<br>固定文字列："storage#object"|
|name|String|オブジェクトの名前|
|bucket|String|バケット名|
|size|BigInteger|データサイズ(バイト単位)|
|generation|Long|世代番号(generation)|
|metageneration|Long|メタ世代番号(metageneration)|
|etag|String|オブジェクトのHTTPエンティティタグ|
|mediaLink|String|オブジェクトのデータをダウンロードするためのURL|
|selfLink|String|オブジェクトのURL|
|contentType|String|ContentオブジェクトデータのContent-Type|
|md5Hash|String|データのMD5ハッシュ値|
|crc32c|String|オブジェクトのcrc32cハッシュ値|
|storageClass|String|オブジェクトのストレージクラス|
|timeCreated|DateTime|オブジェクトの作成時刻|
|timeStorageClassUpdated|DateTime|オブジェクトのストレージクラスが最後に変更された時刻|
|updated|DateTime|オブジェクトのメタデータ変更時刻|

サンプル
```json
{
  "kind": "storage#object",
  "id": "XXX/YYY/1714228298819711",
  "selfLink": "https://www.googleapis.com/storage/v1/b/XXX/o/YYY",
  "mediaLink": "https://storage.googleapis.com/download/storage/v1/b/XXX/o/YYY?generation=1714228298819711&alt=media",
  "name": "YYY",
  "bucket": "XXX",
  "generation": "387971398b98819711",
  "metageneration": "1",
  "contentType": "text/tab-separated-values",
  "storageClass": "STANDARD",
  "size": "3124",
  "md5Hash": "qi3YtM80qPZ+BLDKAD0w==",
  "crc32c": "mvelbkjA==",
  "etag": "CP/QDBLKKJAoUDEAE=",
  "timeCreated": "2024-04-27T14:31:38.880Z",
  "updated": "2024-04-27T14:31:38.880Z",
  "timeStorageClassUpdated": "2024-04-27T14:31:38.880Z"
}
```
<br>
<br>
おしまい。。