【OCI】オブジェクトストレージにJavaでファイルをアップロードしてみる

# はじめに

今回はOracle Cloud Infrastructure（OCI）のオブジェクトストレージに
Java SDKを使ってファイルをアップロードする方法を紹介したいと思います。

■実行環境（クライアントPC）
Windows10, Eclipse, Java

■参考サイト
https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/javasdk.htm#SDK_for_Java

当記事は公式サイトや外部情報を見ただけだと内容を理解するのが難しく、
手っ取り早くJavaでOCIオブジェクトストレージにファイルをアップしたい
という初心者の方向けの内容となっています。
まずは動かしてみるというところにフォーカスしているため
詳細については触れていないため、予めご了承ください。

■構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/01591e36-9577-0ed4-1bee-a214bafb6764.png)

◆目次
1.事前準備
2.Eclipse上でJavaのソースコードを作成
3.ファイルをアップロード

## 1. 事前準備

### ①OCIアカウントを用意する
OCIコンソールにログインし、オブジェクトストレージのバケットを作成し、
ファイルをアップロードできる権限（ポリシーが適用された）ユーザを用意します。

※今回は管理者ユーザ（IDCS_Administrators権限）を利用します。


### ②APIキーを作成する

外部のプログラムからOCIにアクセスするには認証が必要となります。
OCIにはいくつかの認証方法がありますが、今回はAPIキーを使用します。

・OCIコンソールにログインした後、画面右上の人型アイコンからユーザ設定を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/4e3b45f4-bd45-2623-105f-63310b6a62f4.png)

・左下にあるリソースからAPIキーを選択し、APIキーの追加ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/a2639a4b-876a-8843-616c-ee60f37554aa.png)

・APIキー・ペアの生成を選択し、秘密キーと公開キーの両方をダウンロードし、
最後に追加ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/4e0b450b-0ea9-bc3d-b423-8c4c832f8d83.png)

・追加ボタンを押すと、次のような構成ファイルのプレビューが表示されますので、
こちらをコピーしてテキストに保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/e336722a-f2b0-b41f-029e-fbe0ffe38054.png)

・構成ファイルをコピーし忘れても後で再表示することはできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/144b4ce2-33f0-156b-3eb5-d987ce58cacd.png)

※秘密キーと構成ファイルは後で使用するので分かりやすいところに保存しておきます。

### ③オブジェクトストレージのバケットを作成する

左上のナビゲーションメニュー ( Ξ )  から[ストレージ] - [バケット]を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/5143d729-13a9-0be3-e5b5-b58502b10627.png)

バケットの作成ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/c58440f1-edc3-5c37-3ad4-0c41d92ff9dc.png)

今回はバケット名にbuckettestと入れてそのまま作成ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/f49d1ab3-c5b2-a322-5149-80c62f6b9e5c.png)

これで正常にバケットが作成できました。
※可視性はデフォルトのプライベートとなっています。
（プライベートの場合は認証がないとアクセスできません）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/2034e5cf-745c-8911-e04f-6e77187571b3.png)

### ④Eclipseをインストールする

下記のサイト等から自分の使いたいEclipse（Javaを含む）のバージョンを
ダウンロードし、インストールしておく。
https://mergedoc.osdn.jp/


## 2. Eclipse上でJavaのソースコードを作成

### ①プロジェクトを作成する

今回はOCIのSDKを使用するため、Mavenプロジェクトで作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/a2278b9b-1f98-d154-4a0d-8ddf0e465c54.png)

シンプルなプロジェクトの作成
デフォルト・ワークスペース・ロケーションの使用
の２つにチェックが入った状態で次に進みます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/a2e32329-04dc-7f97-6788-3202a962badf.png)

グループIDとアーティファクトIDに任意の名前を入れて完了ボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/ee09ade8-04fb-0e68-12bf-a648fb2f4f6a.png)
ここでは以下を入力します。
グループID: com.ocitest.objectstrage
アーティファクトID: objectstorage

完了すると次のような階層のプロジェクトが作成されるので
pom.xmlを丸ごと差し替えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/304c60be-9623-ab91-531b-76e456d393cf.png)

<b>pom.xml</b>
```
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.ocitest.objectstrage</groupId>
  <artifactId>objectstrage</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>objectstrage</name>
    <dependency>
        <groupId>com.oracle.oci.sdk</groupId>
        <artifactId>oci-java-sdk-core</artifactId>
        <version>2.12.0</version>
    </dependency>        
    <dependencies>
    	<dependency>
        	<groupId>com.oracle.oci.sdk</groupId>
        	<artifactId>oci-java-sdk-objectstorage</artifactId>
        	<version>2.38.0</version>
    	</dependency>
	</dependencies>
</project>
```

続いてプロジェクトにJavaのクラスファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/91be3265-0923-79da-ec0b-c2305fe0c918.png)

ソースフォルダ、パッケージ、名前をつけて
Public static void mainをチェックし、完了ボタンを押します。
ここでは以下のように登録します。
ソース・フォルダー: objectstorage/src/main/java
パッケージ: objectstorage
名前: UploadFile
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/07b76961-4ae6-8ccd-2fc8-b13cc1960492.png)

UploadFile.javaが生成されるので、こちらも丸ごとコードを書き換えます。
```
package objectstorage;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import com.oracle.bmc.auth.AuthenticationDetailsProvider;
import com.oracle.bmc.auth.ConfigFileAuthenticationDetailsProvider;
import com.oracle.bmc.objectstorage.ObjectStorage;
import com.oracle.bmc.objectstorage.ObjectStorageClient;
import com.oracle.bmc.objectstorage.requests.PutObjectRequest;
import com.oracle.bmc.objectstorage.responses.PutObjectResponse;
public class UploadFile {

	public static void main(String[] args) throws Exception {
		
        String configurationFilePath = "<構成ファイルのフルパス>";
        String profile = "DEFAULT";
        String namespaceName = "<ネームスペース>";
        String bucketName = "<バケット名>";
        String objectName = "<アップロードファイル名>";
        String contentType = "application/octet-stream";
        String filePath = "<アップロードファイルのフルパス>";
        
        // 認証情報の取得
        AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(configurationFilePath, profile);

        // Object Storageクライアントの作成
        ObjectStorage client = new ObjectStorageClient(provider);
        client.setRegion("ap-tokyo-1");

        // ファイルの読み込み
        File file = new File(filePath);
        InputStream stream = new FileInputStream(file);

        // アップロードのリクエストの作成
        PutObjectRequest request = PutObjectRequest.builder()
                .namespaceName(namespaceName)
                .bucketName(bucketName)
                .objectName(objectName)
                .contentType(contentType)
                .putObjectBody(stream)
                .build();

        // アップロードの実行
        PutObjectResponse response = client.putObject(request);
        client.close();

        System.out.println("Object was uploaded with etag: " + response.getETag());

	}

}
```
次の変数に関しては実行環境に合わせて変更します。
＊入力サンプル
String configurationFilePath = "C:&yen;&yen;Users&yen;&yen;config";
String profile = "DEFAULT";
String namespaceName = "<ネームスペース>";
String bucketName = "buckettest";
String objectName = "data.txt";
String contentType = "application/octet-stream";
String filePath = "C:&yen;&yen;Users&yen;&yen;data.txt";

※注意事項
①APIキーの作成で生成されたファイルは以下ファイル名、パスとして保存しています。
-構成ファイル: C:&yen;Users&yen;config
-秘密キー: C:&yen;Users&yen;oci.pem

②アップロードファイルも①と同階層に保存しています。
C:&yen;Users&yen;data.txt

③Javaでファイルパスを指定する際は以下のように円マークを重ねる必要があります。
例. C:&yen;&yen;Users&yen;&yen;config

④<ネームスペース>はオブジェクトストレージのバケット情報から確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/80c6b71c-04c0-af40-24b8-7112098d0a13.png)
⑤構成ファイル（config）の内容について
APIキーを作成した際に構成ファイルをそのまま保存しましたが、
key_fileは何も設定されていないため秘密キーが保存されている
フルパスに書き換えてください。

[DEFAULT]
user=ocid1.user.oc1..xxxxxxxxxxxxxxxxxxxxxxx
fingerprint=1f:12:xxxxxxxxxxxxxxxxxxxxxxxxxx
tenancy=ocid1.tenancy.oc1..xxxxxxxxxxxxxxxxx
region=ap-tokyo-1
key_file=C:&yen;&yen;Users&yen;&yen;oci.pem

pom.xml、Javaのソースコード、構成ファイル(config)、秘密キー、
アップロードファイルの準備が整ったら、Mavenのプロジェクトの更新を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/5efdf66e-df6d-dec1-051e-78dcacd276cc.png)
対象のプロジェクトを選択して、OKを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/daa3824e-281c-c9e2-bf5b-c5d42f05da43.png)
ここまでの作業で準備が全て整いました。

## 3. ファイルをアップロード

あとはEclipseからJavaを実行するだけでオブジェクトストレージに
ファイルがアップロードされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/0932c3fa-8db2-76f5-2d9b-6a8f279f0a0a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493138/d88a2e74-868b-b24f-2aa6-40274e8dd387.png)

## おわり
以上、OCI SDKを使ってオブジェクトストレージに
ファイルを簡単にアップロードすることができました。