728x90
반응형

Multer는 Node.js를 위한 미들웨어로, 다중 파트(Multipart) 데이터를 처리하는 데 사용됩니다. 특히 파일 업로드와 관련해 매우 유용하며, Nest.js에서도 쉽게 통합할 수 있습니다. 아래는 Multer에 대한 개념 정리와 Nest.js 프로젝트에 적용하는 방법에 대한 예시입니다.


Multer의 개념

Multer란?

  • Multipart/form-data: HTML form 태그로 전송되는 파일 데이터를 처리하기 위한 포맷입니다. 일반적으로 파일 업로드에 사용됩니다.
  • Multer: Express.js 기반의 미들웨어로, HTTP 요청에서 multipart/form-data 데이터를 처리하는 데 특화되어 있습니다.

Multer의 주요 기능

  1. 파일 저장 위치:
    • 메모리(memoryStorage): 파일이 버퍼에 저장됩니다.
    • 디스크(diskStorage): 서버의 디스크에 파일이 저장됩니다.
  2. 파일 필터링:
    • 업로드할 파일의 유형(예: 이미지, 텍스트 파일 등)을 제한할 수 있습니다.
  3. 이름 지정:
    • 업로드된 파일의 이름을 제어할 수 있습니다.
  4. 제한 설정:
    • 업로드 파일 크기, 개수 등을 제한할 수 있습니다.
    •  

Multer를 Nest.js 프로젝트에 적용하기

1. Multer 설치

Nest.js에서 Multer를 사용하려면 관련 패키지를 설치해야 합니다:

npm install --save @nestjs/platform-express multer

2. Controller 구현

Multer를 사용하여 파일 업로드를 처리하는 컨트롤러를 작성합니다.

import { Controller, Post, UseInterceptors, UploadedFile } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { diskStorage } from 'multer';
import { extname } from 'path';

@Controller('upload')
export class UploadController {
  @Post()
  @UseInterceptors(
    FileInterceptor('file', {
      storage: diskStorage({
        destination: './uploads', // 파일 저장 경로
        filename: (req, file, callback) => {
          // 파일 이름 설정: 현재 시간 + 확장자
          const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1e9);
          const ext = extname(file.originalname);
          callback(null, `${uniqueSuffix}${ext}`);
        },
      }),
      limits: {
        fileSize: 5 * 1024 * 1024, // 최대 파일 크기: 5MB
      },
      fileFilter: (req, file, callback) => {
        if (!file.mimetype.match(/\/(jpg|jpeg|png|gif)$/)) {
          return callback(new Error('Only image files are allowed!'), false);
        }
        callback(null, true);
      },
    }),
  )
  uploadFile(@UploadedFile() file: Express.Multer.File) {
    console.log('Uploaded file:', file);
    return {
      message: 'File uploaded successfully!',
      file: file,
    };
  }
}

3. Module 설정

컨트롤러를 모듈에 등록합니다.
upload.module.ts

import { Module } from '@nestjs/common';
import { UploadController } from './upload.controller';

@Module({
  controllers: [UploadController],
})
export class UploadModule {}

 

app.module.ts

UploadModule을 메인 모듈에 포함시킵니다.

import { Module } from '@nestjs/common';
import { UploadModule } from './upload/upload.module';

@Module({
  imports: [UploadModule],
})
export class AppModule {}

4. 폴더 생성

업로드된 파일을 저장할 디렉토리를 생성합니다. 프로젝트 루트에 uploads 폴더를 만들어야 합니다:

/final-Project
  ├── src
  │     ├── app.module.ts
  │     ├── upload
  │           ├── upload.controller.ts
  │           ├── upload.module.ts
  ├── uploads    <-- 업로드된 파일 저장 디렉토리

 

728x90
반응형

+ Recent posts