Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

【JS/GCS】ファイルアップロードオプション

内容

GCSに画像やら動画やらをアップロードする実装についてメモしておきます。

fs.createReadStream

下記のドキュメントで実装されています。
Cloud Storage の使用  |  Node.js ドキュメントに対応した App Engine フレキシブル環境

上記で実装している blob.createWriteStream メソッドの中身を見てみると以下のようなサンプル実装もあり、参考になります。

import * as fs from 'fs'

fs.createReadStream('panda.jpg')
  .pipe(file.createWriteStream({
    metadata: {
      contentType: 'image/jpeg',
      metadata: {
        custom: 'metadata'
      }
    }
  }))
  .on('error', function(err) {})
  .on('finish', function() {
    // The file upload is complete.
  });

ファイル作成

また createWriteStream を使って、バイナリからファイルを作成することも可能です。

const stream = fs.createWriteStream(filename); // 'image.png' とか 'video.mp4' とか
stream.write(binary) // バイナリデータをファイルに書き出す

bucket.upload

下記の場合だとサーバー上に画像が吐き出される形になります。

const bucket = this.gcs.bucket('staging');

bucket.upload(filename, {
  // GCSのフォルダ構成を指定
  // filenameは、'image.png' とか 'video.mp4' とか
  destination: `test/${filename}`,
  gzip: true,
  metadata: {
    cacheControl: 'no-cache',
  },
}).catch((err)=>{
  console.error(`Failed to Upload`)
});

Google Cloud Storageにファイルを保存する - iyuichiの私的開発ログ

file.save

バイナリをそのままアップロードする方法です。
save メソッドの引数がバイナリでも受け取ることができるので(any型)、ファイルをサーバー上に作成せずともGCSにアップロードすることが可能です。

const bucket = this.gcs.bucket('staging'); // バケットの指定
const blob = bucket.file(`test/${filename}`); // ここでフォルダ構成 + ファイル名を指定できる

return blob.save(binary) // バイナリデータを指定
  .then(() => {
    return file.getSignedUrl({ // 必須項目は、action と expires
      action: 'read',
      expires: '03-09-2500',
    })
  })
  .then((urls: any[]) => {
    const url = urls[0];
    return url
  })
  // 特に expires とか設定しないのであれば、`https://storage.googleapis.com/staging/test/${filename}` とかで返すことも可能
  .catch((err: any) => {
    console.log(`Unable to upload encoded file ${err}`)
  })

参考にした記事
uploading buffer or string · Issue #2334 · googleapis/google-cloud-node · GitHub
File - Documentation

sanoyo
自衛隊からソフトウェアエンジニア
https://note.com/yokosano
engineerlife
技術力をベースに人生を謳歌する人たちのコミュニティです。
https://community.camp-fire.jp/projects/view/280040
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