4
4

More than 3 years have passed since last update.

[Node.js] 一時的ファイル(temp file)を使ってFirebase Storageへファイルをアップロードする

Posted at

環境・バージョン

  • node version v14.4.0
  • "firebase-admin": "^8.7.0"
  • "tmp": "^0.2.1"

実装

Firebase Admin SDKの初期化

firebase-admin.js
var admin = require('firebase-admin')

// Retrieve environment variables
const ServiceAccountFilePath = process.env.FIREBASE_SERVICEACCOUNT_FILEPATH
const StorageURL = process.env.FIREBASE_STORAGE_URL // xxxxx.appspot.com

const serviceAccount = require(ServiceAccountFilePath)

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  storageBucket: StorageURL,
})

module.exports = admin

temp fileを使ってアップロード

Firebase Storageに対してファイルをアップロードするために、GCP Node.jsライブラリのBucket.uploadメソッドを利用しました。

一時的ファイル作成と削除にはtmpというサードパッケージを利用しました。

firebase-storage.js
const fs = require('fs')
const tmp = require('tmp')
const admin = require('./firebase-admin') // 上記の初期化コードをインポート

const requestToStorageService = (cloudFilePath, fileContent) => {
  var promise

  tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback) {
    if (err) throw err

    try {
      const bucket = admin.storage().bucket()

      fs.writeFile(path, JSON.stringify(fileContent), err => { // 一時ファイルに書き込み
        if (err) throw err
      })

      promise = bucket.upload(path, { // ファイルをFirebase Storageへアップロード
        destination: cloudFilePath,
        metadata: { contentType: 'application/json' },
      })
    } finally {
      cleanupCallback() // ファイル削除
    }
  })

  return promise
}

tmp.file(function _tempFileCreated(err, path, fd, cleanupCallback)によって一時的ファイルのパス(path)とファイルディスクリプタ(fd)が渡されます。

そのファイルに書き込みし、Firebase Storageへアップロードします。

また、bucket.uploadはPromiseを返します。

4
4
0

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
4
4