Node.js file, image upload

 

Summry

본 문서에서는 node.js에서 multer module을 사용해 이미지를 업로드 및 폼데이터를 처리하는 방법을 정리한다.

  • express는 사용자가 업로드한 파일을 받아서 저장하는 기본 기능을 제공하지 않는다.
  • 따라서 모듈을 설치해서 (ex. multer) 사용자가 전송한 파일을 처리하는 작업을 해야한다.

send me email if you have any questions.


module install

$ npm install multer --save

code example

const multer = require('multer');

// dets : 저장 위치, limits : 파일 최대 크기 제한
const upload = multer({ dest: 'images/', limits: { fileSize: 5 * 1024 * 1024 } });

app.post('/upload', upload.single('img'), (req, res) => {
  console.log(req.file); 
});

폼데이터나 폼 태그를 통해 업로드한 이미지를 올리면 req.file로 정보가 들어오고, dest 속성에 지정해둔 경로에 이미지가 저장된다.

upload.single('img') 폼데이터의 속성명이 img이거나 폼 태그 인풋의 name이 img인 파일 하나를 받겠다는 뜻이다. 이미지가 아닌 나머지 데이터는 그대로 req.body에 들어오게 된다.

  • 만약 이미지를 하나가 아닌 여러 개를 받고 싶다면 upload.array(‘키’, 최대파일개수)를 사용한다. req.file 대신 req.files에 정보가 담긴다.
const multer = require('multer');

// dets : 저장 위치, limits : 파일 최대 크기 제한
const upload = multer({ dest: 'images/', limits: { fileSize: 5 * 1024 * 1024 } });

app.post('/up', upload.array('img'), (req, res) => {
  console.log(req.file); 
});

업로드된 파일 이름이 이상하다면

images/에 파일이 업로드 되긴 하는데 파일명이 ff542d0193e5b9053d5c1b4e803614a1처럼 저장된다면 아래의 방법으로 원래 이름으로 저장할 수 있다.

  • 파일명이 알아보기 어렵고 확장자가 붙지 않는것은 보안상 의도된것임.
const upload = multer({
  storage: multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, 'images/');
    },
    filename: function (req, file, cb) {
      cb(null, file.originalname);
    }
  }),
});

위의 방법은 파일명이 중복되는 문제가 발생할 수 있다.

const path = require('path');

const upload = multer({
  storage: multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, 'images/');
    },
    filename: function (req, file, cb) {
      cb(null, new Date().valueOf() + path.extname(file.originalname));
    }
  }),
});

위의 방법을 사용하면 타임스탬프.확장자 형식으로 파일명이 저장된다.

Reference

multer를 사용해 이미지 업로드하기 - zerocho.com