☄️

【Scala】GoogleCloudStorage(GCS)にファイルをアップロードする

2022/02/11に公開

概要

ScalaでGoogleCloudStorage(GCS)にファイルアップロードを実装してみましたので、メモ書きします。
Scalaと言いつつ使用するのはJavaのライブラリなので、Javaでもほぼ同様の実装になると思います。

実装の前提等

実装サンプル

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