OCIのAlways Freeアカウントにある10GBのオブジェクトストレージを活かしたいなーと思っていろいろググって見たもののいい感じにまとまっている資料がこれくらいだったし、探すのも大変だったので整理する意味も込めて作成。
環境
- 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設定ファイルの使い方をまとめてみた
[OCI CLIを利用してコマンドラインからOCIを操作する方法]
("https://www.ashisuto.co.jp/db_blog/article/N0021_OracleCloud_20200626.html")
maven
ここにあるので必要なものを取得する。Gradleは適宜読み替える。最低限は多分下記。
<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と連携し、ファイルをアップロードする。
@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の名称