☄️
【Scala】GoogleCloudStorage(GCS)にファイルをアップロードする
概要
ScalaでGoogleCloudStorage(GCS)にファイルアップロードを実装してみましたので、メモ書きします。
Scalaと言いつつ使用するのはJavaのライブラリなので、Javaでもほぼ同様の実装になると思います。
実装の前提等
- GCSのライブラリのインストールや認証のキーファイルの取得は、こちらのドキュメントを参照ください。(言語のタブはJavaを選択してください)
- フレームワークはPlayFlameworkを、今回使用しました。認証のキーファイルの読み込みはGetting a resource file as an InputStream in Playframeworkの記事を参考にしました。
- APIリクエストでのファイル受け取りについては、実装サンプルの記載からは割愛します。PlayFrameworkでファイルを受け取る実装については、【Scala】PlayFrameworkで複数ファイルのリクエストを受け取るの記事を参照ください。
実装サンプル
object GcsSample {
val config = ConfigFactory.load()
// GCSの操作をするオブジェクトを取得するメソッド
def getStorageObject(env: play.api.Environment): Storage = {
// あらかじめ取得した認証キーのファイリを読み込み
val resource = env.resourceAsStream("gcsKey.json")
val credentials = GoogleCredentials
.fromStream(resource.get)
.createScoped("https://www.googleapis.com/auth/cloud-platform")
// GCPのプロジェクトIDをconfigファイルから取得して設定
StorageOptions.newBuilder
.setCredentials(credentials)
.setProjectId(config.getString("gcs.projectId")).build.getService()
}
// アップロード時のBlobのIDを生成
def getBlobId(fileName: String): BlobId = {
// GCS上で作成したフォルダ名をconfigファイルから取得して設定
val filePath = config.getString("gcs.folder") + fileName
// GCS上のバケット名をconfigファイルから取得して設定
BlobId.of(config.getString("gcs.bucket"), filePath)
}
// ファイルをGCSにアップロードする実処理
def uploadFileToGcsFuture(uploadFile: File, fileName: String, env: play.api.Environment)(implicit ec: ExecutionContext): Future[Try[String]] = {
// Futureにする必然性はないのでお好みで
Future {
Try {
// 上記のメソッドでGCSの操作をするオブジェクトを取得
val storage = getStorageObject(env)
// 上記のメソッドでblobIDを生成
val blobId = getBlobId(fileName)
val blobInfo = BlobInfo.newBuilder(blobId).build
val blobFile = storage.create(blobInfo, Files.readAllBytes(Paths.get(uploadFile.getPath())))
// アップロードしたファイルへのリンクを返す
blobFile.getMediaLink()
}
}
}
}
Discussion