Multer는 Node.js를 위한 파일 업로드 미들웨어입니다. 이 미들웨어는 HTML 폼을 통해 전송된 파일을 쉽게 처리할 수 있도록 도와줍니다. Multer를 사용하면 파일을 메모리나 디스크에 저장하고 파일의 메타데이터를 쉽게 액세스할 수 있습니다.
주요 특징 및 기능:
// index.js
const exrpess = require("express");
const multer = require("multer");
const app = express();
const upload = multer({dest: "uploads/"});
// single file upload
app.post("/upload", upload.single("file"), (req, res) => {
res.status(200).json({success: true});
})
// multiple file uploads
app.post("/upload", upload.array("file", 2), (req, res) => {
res.status(200).json({success: true});
})
app.listen(4000, () => console.log("listening on port 4000"));
// index.js
const exrpess = require("express");
const multer = require("multer");
const app = express();
const upload = multer({dest: "uploads/"});
// multiple fields uploads
const multiUpload = upload.fields([
{name: "avatar", maxCount: 1},
{name: "resume", maxCount: 1},
]);
app.post("/upload", multiUpload, (req, res) => {
res.status(200).json({success: true});
});
app.listen(4000, () => console.log("listening on port 4000"));
uuid package 설치
UUID(Universally Unique IDentifier) : 범용 고유 식별자. 중앙에서 관리되지 않는 분산 환경에서 개별 시스템이 발급한 id의 유일성을 보장하기 위해 탄생되었다. 1버전과 4버전이 주로 사용되나 4버전이 가장 많이 사용되는데, 이는 1버전은 타임스탬프를 기준으로 생성하는 반면, 4버전은 uuid를 무작위로 생성하기 때문이다.
// index.js
const exrpess = require("express");
const multer = require("multer");
const uuid = require("uuid").v4;
const app = express();
// custom filename
const storage = multer.diskStorage({
// diskStorage(): 파일을 디스크에 저장할 때 사용되는 옵션
destination: (req, file, cb) => {
cb(null, "uploads");// cb 첫 번째 인자: 에러가 발생했을 때 반환되는 값. 두 번째 인자: 에러가 발생하지 않았을 때 파일이 저장되는 경로 또는 파일의 이름
},
filename: (req, file, cb) => {
const {originalname} = file;
cb(null, `${uuid()}-${originalname}`);
}
});
const fileFilter = (req, file, cb) => {
if(file.mimetype.split("/")[0] === 'image/jpeg') {
cb(null, true)
} else {
cb(new Error("file is not of the correct type."), false);
}
};
const upload = multer({
storage,
fileFilter,
litmits: {fileSize: 1000000, files: 2}
});//1 megabyte
app.post("/upload", upload.array("file"), (req, res) => {
res.status(200).json({success: true});
})
// error handling middleware
app.use((error, req, res, next)=>{
if (error instanceof multer.MulterError) {
if(error.code==="LIMIT_FILE_SIZE") {
return res.json({message: "file limit reached."
});
}
if(error.code === "LIMIT_FILE_COUNT"){
return res.json({message: "file is too large."
});
}
if(error.code === "LIMIT_UNEXPECTED_FILE"){
return res.json({message: "file must be an image."
});
}
})
app.listen(4000, () => console.log("listening on port 4000"));
#consol.log(multiUpload())
{
fieldname: 'resume',
originalname: 'resume.jpg',
encoding: '7bit',
mimetype: 'image/jpeg',
destination: 'uploads/',
filename: 'bd37650a5112d9cb8f9gc600207306d',
path: 'uploads//bd37650a5112d9cb8f9gc600207306d',
size: 44692
}