OCIのオブジェクトストレージにJavaからファイルをアップロードする 

OCIのAlways Freeアカウントにある10GBのオブジェクトストレージを活かしたいなーと思っていろいろググって見たもののいい感じにまとまっている資料が[これ]("https://orablogs-jp.blogspot.com/2019/01/cloud-java-controlling-your-cloud.html")くらいだったし、探すのも大変だったので整理する意味も込めて作成。

#環境

- Ubuntu 20.04
- Visual Studio Code

#下準備

- configファイルを作成する

今回使ったのは接続情報をクライアントにもたせる形式なので、configファイルを作成する。
この辺を参考に設定。

 [Oracleの公式資料]
("https://docs.oracle.com/ja-jp/iaas/Content/API/SDKDocs/climanualinst.htm")
 [Oracle Cloud(OCI)のoci cli設定ファイルの使い方をまとめてみた]("https://qiita.com/feifo/items/29d842da0102379cf527")
[OCI CLIを利用してコマンドラインからOCIを操作する方法]
("https://www.ashisuto.co.jp/db_blog/article/N0021_OracleCloud_20200626.html")

#maven
[ここ]("https://mvnrepository.com/artifact/com.oracle.oci.sdk")にあるので必要なものを取得する。Gradleは適宜読み替える。最低限は多分下記。

```pom.xml
		<dependency>
		    <groupId>com.oracle.oci.sdk</groupId>
 		    <artifactId>oci-java-sdk-common</artifactId>
    		<version>2.12.0</version>
		</dependency>
		<dependency>
    		<groupId>com.oracle.oci.sdk</groupId>
    		<artifactId>oci-java-sdk-core</artifactId>
    		<version>2.12.0</version>
		</dependency>
		<dependency>
		    <groupId>com.oracle.oci.sdk</groupId>
    		<artifactId>oci-java-sdk-objectstorage</artifactId>
    		<version>2.12.0</version>
		</dependency>
```

#Java

もしかしたらもっと簡潔にアップロードできるAPIがあるのかも。見つからなかった。
コメントに記載の手順でOCIと連携し、ファイルをアップロードする。

```OciFileUploadComponentImpl.java
@ConfigurationProperties("ocifileupload")
@Component
public class OciFileUploadComponentImpl implements FileUploadComponent {

        String configurationFilePath = "~/.oci/config";
        String profile = "DEFAULT";
        String regionId = Region.AP_TOKYO_1.getRegionId();
        String bucketName = "bucket-20211217-1537";

        @Override
        public void uploadFile(InputStream is, String fileName, String contentType) throws IOException {

                //クライアントの作成
                final ConfigFileReader.ConfigFile configFile = ConfigFileReader.parseDefault();
                final AuthenticationDetailsProvider provider = new ConfigFileAuthenticationDetailsProvider(configFile);
                ObjectStorage client = ObjectStorageClient.builder().build(provider);
                client.setRegion(regionId);
                GetNamespaceResponse namespaceResponse = client.getNamespace(GetNamespaceRequest.builder().build());
                String namespaceName = namespaceResponse.getValue();
                //アップロードするファイルの情報をOCIに伝える
                CreateMultipartUploadDetails createMultipartUploadDetails = CreateMultipartUploadDetails.builder()
                                .object(fileName).contentType(contentType).build();
                CreateMultipartUploadRequest createMultipartUploadRequest = CreateMultipartUploadRequest.builder()
                                .bucketName(bucketName).namespaceName(namespaceName)
                                .createMultipartUploadDetails(createMultipartUploadDetails).build();
                CreateMultipartUploadResponse createMultipartUploadResponse = client
                                .createMultipartUpload(createMultipartUploadRequest);
                //OCIにファイルをアップロードする。大容量ファイルは送らないので、分割はしない。
                UploadPartRequest uploadPartRequest = UploadPartRequest.builder()
                                .namespaceName(namespaceName)
                                .bucketName(bucketName)
                                .objectName(fileName)
                                .uploadPartBody(is)
                                .uploadId(createMultipartUploadResponse.getMultipartUpload().getUploadId())
                                .uploadPartNum(1)
                                .build();
                UploadPartResponse uploadPartResponse = client.uploadPart(uploadPartRequest);
                //アップロードしたファイルをコミットする。
                List<CommitMultipartUploadPartDetails> commitMultipartUploadPartDetailsList = new ArrayList<>();
                commitMultipartUploadPartDetailsList
                                .add(CommitMultipartUploadPartDetails.builder().etag(uploadPartResponse.getETag())
                                                .partNum(1).build());
                CommitMultipartUploadDetails commitMultipartUploadDetails = CommitMultipartUploadDetails.builder()
                                .partsToCommit(commitMultipartUploadPartDetailsList).build();
                CommitMultipartUploadRequest commitMultipartUploadRequest = CommitMultipartUploadRequest.builder()
                                .namespaceName(namespaceName)
                                .bucketName(bucketName)
                                .objectName(fileName)
                                .uploadId(createMultipartUploadResponse.getMultipartUpload().getUploadId())
                                .commitMultipartUploadDetails(commitMultipartUploadDetails)
                                .build();
                client.commitMultipartUpload(commitMultipartUploadRequest);
        }

}
```

##パラメータの詳細

- configurationFilePath

前セクションで作成したconfigファイルのpath

- profile

利用するプロファイル（個人利用の場合はだいたいDEFAULTだと思う）

- regionId

利用するリージョンのID

- bucketName

作成したbudgetの名称