
こんにちは、うましです!
今回はCloud Storageへのフォルダのアップロード方法について解説します!
ファイルのアップロード方法は解説記事であふれていますが、
フォルダの構造を保持したままアップロードする方法は少なく、私自身苦戦したので、皆さまのご参考になれば嬉しいです!
今回はCloud Storageへのフォルダのアップロード方法について解説します!
ファイルのアップロード方法は解説記事であふれていますが、
フォルダの構造を保持したままアップロードする方法は少なく、私自身苦戦したので、皆さまのご参考になれば嬉しいです!
- ・前提
- ・Cloud Storageの準備:Bucket作成
- ・Cloud Storageの準備:アクセス権 設定
- ・Javaでアップロードの実装
- ・動作確認
- ・参考:Cloud Storageにおけるフォルダとは
前提
・ファイルシステムからCloud Storageにフォルダをアップロードする
・フォルダ構造を保持したままアップロードする
・使用環境:Java1.8.0、Spring
・フォルダ構造を保持したままアップロードする
・使用環境:Java1.8.0、Spring
Cloud Storageの準備:Bucket作成
まずは、Cloud Storageの準備です。
Cloud Storageは「Bucket(バケット)」と呼ばれる箱にデータを出し入れできるサービスです。
では、早速Bucketを作っていきましょう。
1.Cloud Storage > バケットの画面から「+作成」ボタンを押下
2.必要事項を入力し「作成」ボタンを押下
※本記事のメインではないため詳細は割愛します。
Cloud Storageは「Bucket(バケット)」と呼ばれる箱にデータを出し入れできるサービスです。
では、早速Bucketを作っていきましょう。
1.Cloud Storage > バケットの画面から「+作成」ボタンを押下

2.必要事項を入力し「作成」ボタンを押下
※本記事のメインではないため詳細は割愛します。

Cloud Storageの準備:アクセス権 設定
Cloud Storageへのアクセス権を付与します。
本来は、バケットごとへの権限付与や制限をする必要がありますが、
今回は細かいことは一旦忘れてサービスアカウントのアクセスキーを使用します。
1.サービスアカウントの鍵を作成

2.JSONキーを選択し、作成
3.JSONキーをローカルへ保存
※このJSONファイルを使用してCloud Storageへのアクセス認証を行います
本来は、バケットごとへの権限付与や制限をする必要がありますが、
今回は細かいことは一旦忘れてサービスアカウントのアクセスキーを使用します。
1.サービスアカウントの鍵を作成


2.JSONキーを選択し、作成

3.JSONキーをローカルへ保存
※このJSONファイルを使用してCloud Storageへのアクセス認証を行います
Javaでアップロードの実装
では、準備が長かったですが本題のフォルダアップロードに入ります。
以下のような構造のフォルダを例にアップロードします。
ざっくりですが、以下の流れで構造を保ったままフォルダをアップロードすることができました。
以下のような構造のフォルダを例にアップロードします。
hoge1
└-- hoge1.txt
└-- hoge2
└-- hoge2.txt
ざっくりですが、以下の流れで構造を保ったままフォルダをアップロードすることができました。
- ブラウザからMultipartFile形式でフォルダを受け取る
- サービスアカウントファイルを使用して認証する
- MultipartFileをFor文でファイル1つずつアップロード処理を実行
// 変数を宣言
String serviceAccountPath = [JSONファイルのパス];
String bucketName = [アップロード先のバケット名];
// 1.ブラウザからMultipartFile形式でフォルダを受け取る
public static void uploadObject(String serviceAccountPath, List<MultipartFile> multiFiles, String bucketName){
// 2.サービスアカウントファイルを使用して認証する
Storage storage = StorageOptions.newBuilder().setCredentials(
ServiceAccountCredentials.fromStream(
new FileInputStream(serviceAccountPath)))
.build().getService();
// 3.MultipartFileをFor文でファイル1つずつアップロード処理を実行
for(MultipartFile multiFile : multiFiles){
// 4.アップロード処理を実行
// マルチパートファイルからinputstreamを取得する
InputStream inputStream = multiFile.getInputStream();
// アップロードするファイル名を取得する
String fileName = multiFile.getOriginalFilename();
// バケット名とファイル名からBlobInfoを作成する
BlobInfo blobInfo = BlobInfo.newBuilder(bucketName, fileName).build();
// WriteChannelをストレージとBlobInfoから作成する
WriteChannel uploadWriter = storage.writer(blobInfo);
// アップするデータを細切れにして書き込む
byte[] buffer = new byte[10 * 1024 * 1024];
int limit;
while ((limit = inputStream.read(buffer)) >= 0){
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer, 0, limit);
// BlobInfoへinputstreamのコンテンツを書き込む
uploadWriter.write(byteBuffer);
}
}
}
※このままだとメモリが開かれっぱなしなので適宜close()を入れましょう 動作確認
では動かしていきましょう。
作成したバケットにアップロードされていますね!
フォルダ構成も保持されているのがわかります!
作成したバケットにアップロードされていますね!

フォルダ構成も保持されているのがわかります!


参考:Cloud Storageにおけるフォルダとは
上記のように、コンソール上で確認するとフォルダ構造が保持されて見えますが、
Cloud Storageでは、実はフォルダという概念は存在しません。
バケットの中に、2つのオブジェクトが存在するだけです。
hoge1というフォルダは存在せず、文字列「hoge1」がオブジェクト名の一部になるだけです。
ここで注意なのが、オブジェクトとして判定されないため下図のhoge3はアップされないということです。
今回はフォルダ構造を保持したままフォルダをアップロードする方法について紹介しました。
いかがでしたでしょうか?
参考になった!わかりにくい!などご感想いただけると嬉しいです!
当社、システムサポートは、Google Cloudの導入・移行・運営支援を行っています。
お手持ちのデータのGoogle Cloud BigQuery移行、データの可視化のご相談は、以下よりお願いいたします。
Cloud Storageでは、実はフォルダという概念は存在しません。
hoge1
└-- hoge1.txt
└-- hoge2
└-- hoge2.txt
バケットの中に、2つのオブジェクトが存在するだけです。
hoge1というフォルダは存在せず、文字列「hoge1」がオブジェクト名の一部になるだけです。
hoge1/hoge1.txt
hoge1/hoge2/hoge2.txt
なので、MultipartFileをfor文で回すだけで、フォルダ構造を維持してアップロードできるんですね!ここで注意なのが、オブジェクトとして判定されないため下図のhoge3はアップされないということです。
hoge1
└-- hoge1.txt
└-- hoge2
└-- hoge2.txt
└-- hoge3
今回はフォルダ構造を保持したままフォルダをアップロードする方法について紹介しました。
いかがでしたでしょうか?
参考になった!わかりにくい!などご感想いただけると嬉しいです!
当社、システムサポートは、Google Cloudの導入・移行・運営支援を行っています。
お手持ちのデータのGoogle Cloud BigQuery移行、データの可視化のご相談は、以下よりお願いいたします。