본문 바로가기

Node.js

Express multipart/form-data 파일 받기

728x90

express + react로 사이트 개발 중 이미지 업로드를 위해 Content type을 multipart/form-data으로 전송하면

서버에서 request body에 데이터가 undefined로 되는 이슈가 생겼다.

 

node에서 multipart/form-data를 사용하기위해 Multer라는 미들웨어를 사용하기로 했다.

https://github.com/expressjs/multer/blob/master/doc/README-ko.md

여기서 자세한 properties를 볼 수 있다.

 

Multer 설치

>npm install multer --save

 

 

작성한 코드

var multer = require("multer");

const upload = multer({ dest: 'uploads/' })

router.post('/api/shop', upload.array("imageList", 10), (req, res) => {
    let shop = req.body;
    
    let sql = "INSERT INTO Shop (memberseq, title, categoryseq, phone, zipcode, address, addressdetail, url, content, viewyn, views, rating, thumbnail, register, regdate) "
            + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 'Y', 0, ?, ?, ?, NOW())";
    con.query(sql, [shop.memberseq, shop.title, shop.categoryseq, shop.phone, shop.zipcode, shop.address, shop.addressdetail, shop.url, shop.content, shop.rating, shop.thumbnail , shop.register] 
        ,(err, result) => {
        if(err){
            console.log(err);
            con.rollback();
            return res.status(500).send({error : 'database failure'});
        }
        
        console.log('result : ' + result);
        //result.insertId >> insert한 auto_increment 값
        res.json(result);
    });
});

라우팅할때 두번째 인자로 multer를 넣어주면 된다.

파일이 여러개여서 array(필드, 개수)를 사용했지만, 하나라면 upload.single(필드)를 사용해도 된다.

 

 

//const upload = multer({ dest: 'uploads/' })

const storage = multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, '/tmp/my-uploads')
    },
    filename: function (req, file, cb) {
      cb(null, file.fieldname + '-' + Date.now())
    }
})
const upload = multer({ storage: storage })

단순한 저장인 경우에는 dest로 충분하지만 파일명, 경로를 직접 지정하기위해서는 storage를 써야하고 

디스크에 저장할것이기 때문에 diskStorage를 사용했다. (메모리 스토리지도 있다)

 

cb는 콜백을 의미하는것 같은데 문서에도 딱히 설명이 없다.

 

destination에 경로를 지정할때 해당 디렉토리가 존재해야한다.

없으면 no such directory 에러가난다.

 

dest 썼을때

이미지 파일을 2개 업로드했는데 암호화된 파일명이 4개가있다

 

 

storage를 썻을때

이미지 저장도 잘되고, 데이터도 잘 담겨온다

728x90