17
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Organization

CloudFunctionsからCloudStorageへ画像をアップロードする

async function createPhoto(data: string) {
  try {
    const base64EncodedImageString = data.replace(
      /^data:image\/\w+;base64,/,
      '',
    )
    const imageBuffer = Buffer.from(base64EncodedImageString, 'base64')
    const file = admin
      .storage()
      .bucket()
      .file(`${cloudStoragePhotoPath}/test.jpg`)
    await file.save(imageBuffer, { metadata: { contentType: 'image/jpeg' } })
    const url = await file.getSignedUrl({
      action: 'read',
      expires: '01-01-2099',
    })
    return url
  } catch (e) {
    throw e
  }
}

何をやってるのか

CloudFunctionsなので、どこかにあるファイルから画像は読み込めない。なのでbase64でCloudFunctionsへ画像を送る前提。

データをBufferにする

    const base64EncodedImageString = data.replace(
      /^data:image\/\w+;base64,/,
      '',
    )
    const imageBuffer = Buffer.from(base64EncodedImageString, 'base64')

ここでデータをBufferに。エンコーディング時の識別子があれば、replaceでそれを消す。

ファイルの作成

    const file = admin
      .storage()
      .bucket()
      .file(`${cloudStoragePhotoPath}/test.jpg`)

ここでCloudStorage上にファイルを作成。この時点ではファイルのデータはここに書き込まれていない。

参考: https://cloud.google.com/nodejs/docs/reference/storage/2.3.x/File

    await file.save(imageBuffer, { metadata: { contentType: 'image/jpeg' } })

save() でやっとファイルにデータを書き込む。コンテントタイプもここで忘れずに指定。

URLの取得

    const url = await file.getSignedUrl({
      action: 'read',
      expires: '01-01-2099',
    })

これで公開用のトークン付きURLを取得できる。トークンさえあれば基本誰でも画像にアクセスできる。actionをwriteにすれば、このURLにPOSTすることで画像の上書きをもできるとのこと。普通の使い方ではないけど、そういう用途で使ってみるのも面白いのかも。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
17
Help us understand the problem. What are the problem?