ゆずかまたまうどん

技術, PCゲームレビュー, PCゲームトラブルシュート

express + busboy でfirebase storeにファイルをアップロードするサンプル

概要

express + busboyでfirebase storeにファイルをアップロードするサンプルです

実装

import * as Busboy from 'busboy'
import { Request, Response } from 'express'

const firebaseAdmin = require('firebase-admin')
const serviceAccount = require('../firebase-key.json')

firebaseAdmin.initializeApp({
  credential: firebaseAdmin.credential.cert(serviceAccount),
  storageBucket: 'hogehoge'
})

export default function (req: Request, res: Response) {

  const busboy = new Busboy({ headers: req.headers });
  const allowMimeTypes = ['image/png'];
  const bucket = firebaseAdmin.storage().bucket();

  const filename = 'fuga'
  const filepath = `uploaded_images/${filename}.png`
  const uploadFile = bucket.file(filepath)

  busboy.on('file', (fieldname: string, file: NodeJS.ReadableStream, filename: string, encoding: string, mimetype: any) => {
    if (!allowMimeTypes.includes(mimetype.toLocaleLowerCase())) {
      console.warn('disallow mimetype: ' + mimetype)
      return
    }

    file.pipe(uploadFile.createWriteStream({ metadata: { contentType: 'image/png' } }))

    file.on('end', () => {
      console.log('end')
    });
  });

  busboy.on('finish', () => {
    res.status(200)
  });

  busboy.end(req.body)
}

コメント

stream使えば割と簡潔に書けますね

以下のリポジトリで似たような実装をしてます

github.com