sanguk.dev
작성완료
NestJS 파일 업로드

NestJS 파일 업로드

NestJS에서 파일 업로드를 위한 컨트롤러 구현 방법을 설명하며, multer 타입 설치, 파일 저장 로직, 파일명 관리 및 보안 검증 필요성을 강조한다. 업로드된 파일은 원래 이름으로 저장되지만, 실무에서는 중복되지 않는 이름으로 저장해야 한다.

NestJS

타입 설치 (TypeScript만 해당)

shell
yarn add -D @types/multer

Controller

/src/file/file.controller.ts

typescript
import { Controller, Post, UseInterceptors , UploadedFile } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { FileService } from './file.service.ts';
import * as fs from 'fs';

@Controller('/api/file')
export class FileController {
  constructor(private readonly service: FileService) {}

  @Post('/')
  @UseInterceptors(FileInterceptor('FILE'))
  fileUpload(@UploadedFile() file: Express.Multer.File) {
    const { buffer, originalname } = file;
    const path = __dirname + '/../../upload/' + originalname;

    try {
      fs.writeFileSync(path, buffer);
      return { result: true, message: '파일이 업로드되었습니다.' }
    } catch {
      return { result: false, message: '파일 업로드에 실패하였습니다.' }
    }
  }

}

설명

  1. 필요에 따라 업로드 로직을 file.service.ts에 만들어도 된다.
  2. 저장하는 파일명은 코드에서는 originalname을 그대로 사용했으나 실무에서는 랜덤 문자열이나 타임스탬프와 같이 중복되지 않는 이름으로 저장해야 한다.
  3. 모든 파일을 전부 업로드 할 시 보안에 취약하기 때문에 확장자 또는 파일 유형에 따라 파일 유효성 검사가 필요하다.