Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.
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することで画像の上書きをもできるとのこと。普通の使い方ではないけど、そういう用途で使ってみるのも面白いのかも。

repro
世界59か国6,500以上の導入実績を持つCE(カスタマーエンゲージメント)プラットフォーム「Repro(リプロ)」を提供
https://repro.io/
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