multer는 어려우니까 따로 정리함.
이미지, 동영상 등 여러 파일을 멀티파트 형식으로 업로드할 때 사용하는 미들웨어
멀티파트: enctype이 multipart/form-data인 경우
폼을 통해 업로드된 파일은 body-parser로 처리할 수 없음.
직접 파싱도 안 됨.
그래서 multer 미들웨어를 사용함.
<form enctype="multipart/form-data">
<input type="file" name="image" />
</form>
const multer = require("multer");
const upload = multer({
storage: multer.diskStorage({
destination(req, file, done) {
done(null, "uploads/");
},
filename(req, file, done) {
const ext = path.extname(file.originalname);
done(null, path.basename(file.originalname, ext) + Date.now() + ext);
},
}),
limits: { fileSize: 5 * 1024 * 1024 },
});
app.post('/upload', upload.single('image'), (req, res) => {
console.log(req.file, req.body);
res.send('ok');
});
라우터 미들웨어 앞에 multer 미들웨어를 넣으면,
req.file 객체가 생성되고 그 안에 파일이 들어감.
req.body에는 title이 들어감.
{
fieldname: 'img',
originalname: 'node.png',
encoding: '7bit',
mimetype: 'image/png',
destination: 'uploads/',
filename: 'nodejs3984398934.png',
path: 'uploads\\node9843984.png',
size: 44523
}
<form enctype="multipart/form-data">
<input type="file" name="many" multiple />
</form>
app.post('/upload', upload.array('many'), (req, res) => {
console.log(req.file, req.body);
res.send('ok');
});
결과는 req.files 배열에 들어감.
(html input에 각각 name이 지정)
app.post(
"/upload",
upload.fields([{ name: "image1" }, { name: "image2" }]),
(req, res) => {
console.log(req.files, req.body);
res.send("ok");
}
);
req.files.image1, req.files.image2에 각각 들어감.
미들웨어 single: req.file
none: req.file은 생성 안 됨. req.body만 있음.