Multer 미들웨어

지난 포스팅에서 Multer 미들웨어를 사용하여 이미지 파일을 업로드하는 방법을 알아보았다. 이번에는 Multer의 개념과 사용방법에 대해 알아보자.

Multer란?


Multer는 Node.js에서 파일 업로드를 다루기 위해 사용되는 미들웨어다. Express 프레임워크와 함께 사용되며, 주로 멀티파트(form-data) 형식의 데이터를 처리할 때 사용된다. Multer는 클라이언트에서 전송된 파일들을 쉽게 접근하고 서버의 파일 시스템에 저장할 수 있게 해준다.

Multer 설치 및 기본 사용법


설치

$ npm install --save multer

기본 문법

const upload = multer({ dest: "uploads/" });
const app = express();

app.post("/profile", upload.single("avatar"), function (req, res, next) {
  res.send("Uploaded : ", req.file);
});

req.file에는 아래의 정보를 포함하고 있다.

{
  "fieldname": "avatar",           # 폼에 정의된 필드 
  "originalname": "my-avatar.png", # 사용자가 업로드한 파일 
  "encoding": "7bit",              # 파일의 엔코딩 타입
  "mimetype": "image/png",         # 파일의 Mime 타입
  "destination": "uploads/",       # 파일이 저장된 폴더
  "filename": "836ec06a226a",      # destination  저장된 파일 
  "path": "uploads/836ec06a226a",  # 업로드된 파일의 전체 경로
  "size": 277056                   # 파일의 바이트(byte) 사이즈
}

심화 문법

Multer는 옵션 객체를 허용하며, 그 중 가장 기본 옵션인 dest 요소는 Multer에게 파일을 어디로 업로드 할 지를 알려준다. 만일 옵션 객체를 생략했다면, 파일은 디스크가 아니라 메모리에 저장된다.

기본적으로 Multer는 이름이 중복되는 것을 방지하기 위해서 파일의 이름을 재작성 하며, 필요에 따라 해당 함수는 커스터마이징이 가능하다.

const storage = multer.diskStorage({
  // mimetype에 따라 경로를 다르게 지정.
  destination: function (req, file, cb) {
    if (req.file.mimetype === "image/png") {
      cb(null, "uploads/images");
    } else {
      cb(null, "uploads/files");
    }
  },
  filename: function (req, file, cb) {
    // originalname명이 중복됐을 경우 분기처리.
    if (file.originalname.match(/\.(jpg|jpeg|png|gif)$/)) {
      cb(null, file.fieldname + "-" + Date.now());
    } else {
      cb(null, file.fieldname);
    }
  },
});

const upload = multer({ storage: storage });

참고


Multer - github
생활코딩 - Youtube

Node.js Multer middleware