概要
Node.jsでGoogleCloudStorage(GCS)にアップロードする際に、サーバに配置されてるファイルをアップロードする実装サンプルはけっこう見つけられたのですが、
画面経由で受け取ったファイルを、GCSにアップロードする実装があまり無かったので、今回メモ書きします。
前提
- GCSの設定やライブラリ(google-cloud/storage)については、Node.jsからCloud Storageを利用(入門)をご参照ください。ライブラリの基本的な使い方は【GCP】Cloud StorageをNodeのSDKから実行してみるを参照ください。
- アップロードの実装はNode.js - Upload File to Google Cloud Storageの記事を参考にしました。streamを取得した後に、受け取ったファイルをbufferにしてアップロードする形になります。
- 今回の実装サンプルはNestJSを導入した状態のものですが、Node.jsのみでの環境でもほぼ同じ実装でいけると思います。
実装サンプル
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import {
Storage as Gcs,
Bucket,
} from '@google-cloud/storage';
@Injectable()
export class FileUploadService {
constructor(private configService: ConfigService) {}
getGcsBucket(): Bucket {
// 環境の設定ファイルから認証用のキーファイルとバケット名を取得
const storage = new Gcs({
keyFilename: this.configService.get<string>('GOOGLE_SECRETS_FILE'),
});
return storage.bucket(
this.configService.get<string>('GOOGLE_STORAGE_BUCKET'),
);
}
// 画面から受け取ったファイルとアップロード先のパスを引数に設定
addFileToGcs(uploadFile: Express.Multer.File, uploadPath: string): Promise<string> {
return new Promise((resolve) => {
const bucketFile = this.getGcsBucket().file(uploadPath);
const stream = bucketFile.createWriteStream({
metadata: {
contentType: uploadFile.mimetype,
},
});
stream.on('error', (err) => {
throw err;
});
stream.on('finish', async () => {
bucketFile.makePublic().then(() => {
resolve(bucketFile.publicUrl());
});
});
// ファイルからBufferを取得
stream.end(uploadFile.buffer);
});
}
}