728x90
728x90

 

Multer 모듈

Multer는 Node.js 환경에서 파일 업로드를 처리하기 위한 미들웨어이다. Express와 함께 사용하면 파일 업로드를 쉽게 처리할 수 있으며, connect-multiparty와 비교하여 더 유연하고 안정적으로 파일 업로드를 처리할 수 있다.

Multer는 다양한 옵션을 제공하여 파일 업로드를 보다 세밀하게 제어할 수 있으며, 다양한 예외 상황에 대한 처리도 가능하다.

예를 들어, 파일 사이즈 제한, 파일 형식 제한, 파일 이름 중복 방지 등 다양한 옵션을 설정할 수 있다. 또한, Multer는 여러 파일을 동시에 업로드할 수 있으며, 업로드된 파일의 정보를 쉽게 가져올 수 있는 API도 제공한다.

Multer 모듈은 다음과 같이 설치할 수 있다.

npm install multer

Multer를 사용하기 위해서는 먼저 multer 모듈을 임포트해야 한다.

const multer = require('multer');

 

  1. multer 모듈을 임포트한다.
  2. multer 객체를 생성한다. 이때, storage, limits, fileFilter 등의 옵션을 설정할 수 있다.
  3. multer 객체를 사용하여 파일 업로드를 처리한다. 이때, single, array, fields 등의 메소드를 사용하여 파일 업로드를 처리할 수 있다.

파일 업로드 처리

multer는 http 요청의 본문에 포함된 파일을 서버로 업로드할 수 있도록 지원함

upload.single(fieldname) 또는 upload.array(fieldname[, maxCount])과 같은 메서드를 사용하여 단일 파일 또는 여러 파일을 처리할 수 있음

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/profile', upload.single('ramona'), (req, res, next) => {
  // req.file은 `ramona` 파일에 대한 정보
  // 키(`avatar`)는 multer 미들웨어가 사용되는 필드
})

  • multer는 HTTP 요청의 본문에 포함된 파일을 서버로 업로드할 수 있도록 지원한다
  • upload.single(fieldname) 또는 upload.array(fieldname[, maxCount])과 같은 메서드를 사용하여 단일 파일 또는 여러 파일을 처리할 수 있다
  • upload.single(fieldname)은 fieldname 필드의 단일 파일을 처리한다
  • req.file 객체는 파일에 대한 정보를 담고 있다. fieldname은 upload.single() 메서드가 사용되는 필드 이름

파일 저장 경로 및 이름 지정

업로드된 파일의 저장 경로와 이름을 지정할 수 있다.

const multer = require('multer');
const storage = multer.diskStorage({
  destination: function (req, file, cb) {
    cb(null, 'uploads/')
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now())
  }
});
const upload = multer({ storage: storage });

  • storage 옵션을 설정해 파일 저장 위치, 파일 이름 규칙, 파일 확장자 등을 제어할 수 있다.
  • multer.diskStorage() 메서드를 사용하여 파일 저장 경로와 파일 이름 규칙을 설정한다.
  • cb 콜백 함수를 사용하여 저장 경로와 파일 이름을 반환한다.
  • cb(null, 'uploads/')는 업로드된 파일이 uploads 폴더에 저장되도록 지정한다.
  • cb(null, file.fieldname + '-' + Date.now())는 파일 이름을 fieldname-현재시간 형식으로 지정

파일 유효성 검사

filefilter 옵션을 설정하여 허용되는 파일 확장자, 파일 크기 등을 제한할 수 있다.

const multer = require('multer');
const upload = multer({
  storage: storage,
  fileFilter: function (req, file, cb) {
    // 파일 필터링 로직
    if (!file.originalname.match(/\\\\\\\\.(jpg|jpeg|png|gif)$/)) {
      return cb(new Error('Only image files are allowed!'));
    }
    cb(null, true);
  }
});

  • fileFilter 옵션을 설정해 허용되는 파일 확장자, 파일 크기 등을 제한할 수 있다.
  • fileFilter 콜백 함수는 업로드할 파일의 유효성을 검사한다.
  • 파일이 유효한 경우 cb(null, true)를 호출한다.
  • 유효하지 않은 경우 cb(new Error('Only image files are allowed!'))와 같이 에러를 반환한다

여러 필드 처리

단일 파일 뿐만 아니라 여러 필드(텍스트, 파일)등을 동시에 처리할 수 있다

const multer = require('multer');
const upload = multer();

app.post('/profile', upload.fields([
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 8 }
]), (req, res, next) => {
  // req.files는 `avatar`와 `gallery` 파일에 대한 정보
  // 키(`avatar`와 `gallery`)는 multer 미들웨어가 사용되는 필드명
})
  • 단일 파일 뿐만 아니라 여러 필드(텍스트, 파일)등을 동시에 처리할 수 있다.
  • upload.fields(fields) 메서드를 사용하여 여러 필드를 처리한다.
  • fields는 배열 형태로 필드 정보를 담고 있다
  • 필드 정보는 { name: 필드이름, maxCount: 파일 수 }의 형태로 지정한다.
  • req.files 객체에는 { 필드이름: 파일정보 } 형태로 정보가 담겨 있다.
728x90
300x250

+ Recent posts