LoginSignup
1
1

More than 1 year has passed since last update.

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

Posted at

OCIのAlways Freeアカウントにある10GBのオブジェクトストレージを活かしたいなーと思っていろいろググって見たもののいい感じにまとまっている資料がこれくらいだったし、探すのも大変だったので整理する意味も込めて作成。

環境

  • Ubuntu 20.04
  • Visual Studio Code

下準備

  • configファイルを作成する

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

Oracleの公式資料
Oracle Cloud(OCI)のoci cli設定ファイルの使い方をまとめてみた
OCI CLIを利用してコマンドラインからOCIを操作する方法

maven

ここにあるので必要なものを取得する。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の名称

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1