이 노트는 "Node.js 교과서"를 공부하면서 기록되었다.
이미지는 보통 input[type=file] 태그와 form 태그를 통해서 업로드한다.
이때 form의 인코딩 타입은 multipart/form-data로 되어있다.
이를 통해 올라오는 데이터를 처리하려면 Multer가 필요하다!
multer는 multipart/form-data로 들어온 이미지를 처리하는 모듈로, 지정한 곳에 이미지 저장이 가능하다.
Multer 공식 페이지? 깃헙에 가면 사용법과 설명이 더 자세히 나와있다. 개꿀!
$ npm install multer
var upload = multer({ dest: 'uploads/' })
보통 웹에서는 dest 옵션으로도 충분히 파일 저장 위치를 지정하는 것이 가능하다고 한다.
만약 더 업로드를 제어하고 싶으면 dest 옵션 대신 storage 옵션을 사용하면 된다.
📃 file.js
var express = require('express');
var router = express.Router();
const multer = require('multer');
// 1. 파일 위치 지정을 dest 옵션으로 할 경우
var upload = multer({dest:'uploads/'});
// 2. 파일 저장 위치를 diskStorage()함수로 지정할 경우
var storage = multer.diskStorage({
destination:(req,file,cb)=>{
cb(null, 'uploads/');
},
filename:(req,file,cb)=>{
cb(null,Date.now()+'-'+file.originalname);
}
});
var upload = multer({storage:storage});
router.post('/upload',upload.single(userfile),(req,res)=>{
console.log(req.file);
res.send('upload: '+req.file.filename);
});
콜백 함수가 실행되기 이전에 upload.single('userfile')이 먼저 실행되는데 여기서 데이터에 파일이 포함된 경우는 req 객체에 file 속성을 추가한다. 그래서 res.send()에서 req.file.filename을 쓸 수 있는 것이다.
routes/upload.js
var express = require('express');
var router = express.Router();
const multer = require('multer');
const path = require('path')
var upload = multer({
storage: multer.diskStorage({
destination(req,file,cb){
cb(null,'uploads/') // 처음이 null 인 이유는 첫번째 인자는 error이기 떄문
},
filename(req,file,cb){
const ext = path.extname(file.originalname);
cb(null,path.basename(file.originalname,ext)+new Date().valueOf()+ext)
}
}),
limit:{fileSize: 5*1024*1024},
});
// img는 아이디 값이 img라서
router.post('/img',upload.single('img'),(req,res)=>{
console.log(req.file);
res.json({url:`/img${req.file.filename}`})
});