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 });