Multer

Multer는 multipart/form-data 를 컨트롤 할 수 있는 NodeJS 미들웨어입니다.

https://www.npmjs.com/package/multer

사용함으로써 Request Body 의 File 객체를 쉽게 컨트롤 할 수 있습니다.

여러 옵션들을 편리하게 제공합니다.

프론트엔드 구성

프론트 영역에서는 전송할 폼 필드 이름만 설정해 주시면 됩니다.

각 프레임 워크별로 별도의 폼빌더 등이 있을 수 있지만 생략하고 일반 html 기준으로는 다음과 같습니다.

<form action="/profile" method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
</form>

노드 모듈 설치

$ npm install multer --save $ npm install multer-s3 --save

저장 목적지를 s3로 바로 올리는 플러그인도 존재합니다.

세가지 주요 메소드

.single(fieldname) 하나의 파일을 업로드 할때 사용합니다. file에 복수의 파일을 허용하지 않습니다.

.array(fieldname[, maxCount]) 복수의 파일을 업로드 할때 사용합니다. html에서 multiple 속성이 허용되거나 폼데이터에서 File 이 FileList 에 담겨올경우 입니다.

.fields(fields) 여러 파일 필드를 처리하는 메소드입니다.

처음에 유튜브등에 다른 유저들의 영상의 경우 single과 array만 사용한 예제뿐이라서

문서를 보기 전까지 fields 타입이 있는 줄 모르고 업로드 하나의 과정을 각각 비동기 처리했던 경험이 있는데

.fields를 사용하면 매우 쉽게 해결할 수 있습니다.

[
  { name: 'avatar', maxCount: 1 },
  { name: 'gallery', maxCount: 8 }
]

maxCount 옵션은 생략할 수 있습니다.

서비스 생성

const fileFilter = (req, file, cb) => {
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png' || file.mimetype === 'image/gif') {
        cb(null, true);
    } else {
        cb(new Error('Invalid Mime Type, only JPEG/PNG/GIF'), false);
    }
}

const upload =
multer({
  fileFilter : fileFilter,
  storage: multerS3(
  {
    s3: 's3설정값',
    bucket :  function (req, file, cb) {
      cb(null, req.body.bucket)
    },
    acl: 'public-read',
    metadata: function (req, file, cb) {
      cb(null, {fieldName: '버킷이름'});
    },
    key: function (req, file, cb) {
      cb(null, '저장할 파일명');
    }
  })
})

fileFilter 인자 등을 넣어서 형검사를 선행 할 수 있습니다.

업로드 처리

const singleUpload = upload.single('uploads');
const arrayUpload = upload.array('uploads');
const multipleUpload = upload.fields([{ name: 'cover', }, { name: 'uploads', }]);

업로드 확인

https://s3.ap-northeast-2.amazonaws.com/laerdream.github.io/2019-09-22/2019-09-22-multer0.png

구조만 익숙해지면 정말 사용하기 쉬운 모듈 같습니다.