NestJSで画像アップロードの処理をしようとしたところ、ほとんどがExpressを使用している記事で、Fastifyを使っているものが皆無だったので、Fastifyでどのように画像アップロードを行うのかをまとめておきます。
公式ドキュメントにもExpressの方法しか載っていませんでした。
Documentation | NestJS - A progressive Node.js framework
前提条件
フロントからは画像ファイルとそれに紐づくIDやユーザーの情報をFormData
として送信している前提です。
// 例
const formData = new FormData();
formData.append('image', selectedFile);
formData.append('entityId', entityId);
formData.append('entityName', entityName);
必要なライブラリをインストール
使用するのは、fastify-multipart
というライブラリです。
以下のコマンドでインストールしておきます。
yarn add fastify-multipart
main.ts
でfastify-multipart
を登録
import { fastifyMultipart } from '@fastify/multipart';
async function bootstrap() {
const app = await NestFactory.create<NestFastifyApplication>(
AppModule,
new FastifyAdapter(),
);
const configService = app.get(ConfigService);
await app.register(fastifyMultipart);
// その他の設定...
}
これでfastify-multipart
が使えるようになります。
Serviceに実装する
アップロード関数で引数としてreq: FastifyRequest
を受け取ります。
const parts = req.parts();
これを実行することで、FormData
を取り出します。parts
は非同期のイテラブルなオブジェクトになっているので、for await
を使って取り出していきます。
for await (const part of parts) {
if (part.fieldname === 'entityId' && part.type === 'field') {
entityId = part.value;
} else if (part.fieldname === 'entityName' && part.type === 'field') {
entityName = part.value;
} else if (part.fieldname === 'image' && part.type === 'file') {
fileBuffer = await part.toBuffer(); // ここはお好きな処理を
}
}
-
fieldname
属性はフロントで設定したものです。 -
type
がfile
の場合、ファイルを取得できます。
上記では取り出したファイルをBuffer
型に変換していますが、これをS3にアップロードしてパスだけをDBに保存するなど、さまざまな対応が可能です。
これでNestJSで画像をアップロードすることができます。