NodeJS multer

이승훈·2024년 11월 20일

1. 개요

로컬에 있는 파일을 웹서버에 업로드하는 방법을 알아보겠습니다. 이때 필요한 미들웨어가 「multer」 입니다.

2. 설치

npm install multer

3. 모듈 추가

import multer from 'multer';

4. 설정

1) 확장자 없이 파일명 자동 설정

const upload = multer({dest: 'files/', 옵션});
옵션내용
dest 또는 storage파일이 저장될 위치
fileFilter어떤 파일을 허용할 지 제어하는 함수
limits업로드 될 데이터의 한도
preservePath파일의 base name 대신 보존할 파일의 전체 경로

2) 확장자와 파일명을 직접 설정

import path from 'path';
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, "tmp/my-uploads");
  },
  filename: (req, file, cb) => {
    const ext = path.extname(file.originalname);
    cb(null, file.fieldname + '-' + Date.now() + ext);
  }
});
const upload = multer({ storage });

5. 업로드

1) 하나의 필드명으로 하나의 파일만 업로드하는 경우

(1) 요청
<form action='/' method="POST" enctype="multipart/form-data">
  <input type="text" name="user" />
  <input type="file" accept=".pdf" name="pdfFile" />
  <input type="submit" />
</form>
(2) 응답
router.post('/', UPLOAD.single("pdfFile"), (req, res) => {
  console.log(req.body.user);
  console.log(req.file);
});

2) 하나의 필드명으로 여러개의 파일을 업로드하는 경우

(1) 요청
<form action='/' method="POST" enctype="multipart/form-data">
  <input type="file" name="anyFiles" multiple />
  <input type="submit" />
</form>
(2) 응답
router.post('/', upload.array("anyFiles"), (req, res) => {
  console.log(req.files);
});

3) 여러 필드명으로 각각 하나의 파일만 업로드 하는 경우

(1) 요청
<form action='/' method="POST" enctype="multipart/form-data">
  <input type="file" name="file1" />
  <input type="file" name="file2" />
  <input type="submit" />
</form>
(2) 응답
const fileFields = upload.fields([
  {name: "file1"},
  {name: "file2"}
]);
router.post('/', fileFields, (req, res) => {
  console.log(req.files);
});

4) 여러 필드명으로 각각 하나의 파일 혹은 여러 파일을 업로드 하는 경우

(1) 요청
<form action='/' method="POST" enctype="multipart/form-data">
  <input type="file" name="single" />
  <input type="file" name="multi" multiple />
  <input type="submit" />
</form>
(2) 응답
const fileFields = upload.fields([
  {name: "single"},
  {name: "multi"}
]);
router.post('/', fileFields, (req, res) => {
  console.log(req.files);
});

5) 파일 개수 제한

const fileFields = upload.fields([
  {name: "single"},
  {name: "multi", maxCount: 3}
]);
profile
안녕하세요!

0개의 댓글