NodeJS | How to upload to AWS S3 using Express and Multer (1)

bubblegum·2024년 2월 11일

NodeJS

목록 보기
12/14
post-thumbnail

Multer Package

Multer는 Node.js를 위한 파일 업로드 미들웨어입니다. 이 미들웨어는 HTML 폼을 통해 전송된 파일을 쉽게 처리할 수 있도록 도와줍니다. Multer를 사용하면 파일을 메모리나 디스크에 저장하고 파일의 메타데이터를 쉽게 액세스할 수 있습니다.

주요 특징 및 기능:

  1. 파일 업로드 처리: Multer는 HTTP POST 요청에서 파일 업로드를 처리할 수 있습니다.
  2. 다중 파일 업로드 지원: 한 번에 여러 파일을 업로드할 수 있습니다.
  3. 파일 저장 위치 지정: 업로드된 파일을 메모리나 디스크에 저장할 수 있습니다.
  4. 파일 이름 지정: 업로드된 파일의 이름을 지정하거나 변경할 수 있습니다.
  5. 파일 크기 제한: 업로드할 수 있는 파일의 최대 크기를 제한할 수 있습니다.
  6. 파일 유형 제한: 허용되는 파일 유형을 제한할 수 있습니다.
  7. 각종 옵션 설정 가능: 다양한 옵션을 설정하여 파일 업로드 동작을 커스터마이징할 수 있습니다.

Multer 사용하기

참고영상

// index.js
const exrpess = require("express");
const multer = require("multer"); 

const app = express(); 

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

// single file upload
app.post("/upload", upload.single("file"), (req, res) => {
  res.status(200).json({success: true}); 
})

// multiple file uploads
app.post("/upload", upload.array("file", 2), (req, res) => {
  res.status(200).json({success: true}); 
})

app.listen(4000, () => console.log("listening on port 4000")); 
// index.js
const exrpess = require("express");
const multer = require("multer"); 

const app = express(); 

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

// multiple fields uploads
const multiUpload = upload.fields([
  {name: "avatar", maxCount: 1},
  {name: "resume", maxCount: 1},
]);

app.post("/upload", multiUpload, (req, res) => {
  res.status(200).json({success: true}); 
});

app.listen(4000, () => console.log("listening on port 4000")); 

uuid package 설치

UUID(Universally Unique IDentifier) : 범용 고유 식별자. 중앙에서 관리되지 않는 분산 환경에서 개별 시스템이 발급한 id의 유일성을 보장하기 위해 탄생되었다. 1버전과 4버전이 주로 사용되나 4버전이 가장 많이 사용되는데, 이는 1버전은 타임스탬프를 기준으로 생성하는 반면, 4버전은 uuid를 무작위로 생성하기 때문이다.

// index.js
const exrpess = require("express");
const multer = require("multer");
const uuid = require("uuid").v4; 

const app = express(); 

// custom filename
const storage = multer.diskStorage({ 
  // diskStorage(): 파일을 디스크에 저장할 때 사용되는 옵션
  destination: (req, file, cb) => { 
  	cb(null, "uploads");// cb 첫 번째 인자: 에러가 발생했을 때 반환되는 값. 두 번째 인자: 에러가 발생하지 않았을 때 파일이 저장되는 경로 또는 파일의 이름
  }, 
  filename: (req, file, cb) => {
    const {originalname} = file;
    cb(null, `${uuid()}-${originalname}`);
  }
});

const fileFilter = (req, file, cb) => {
  if(file.mimetype.split("/")[0] === 'image/jpeg') {
    cb(null, true)
  } else {
    cb(new Error("file is not of the correct type."), false);
  }
};

const upload = multer({
  storage, 
  fileFilter, 
  litmits: {fileSize: 1000000, files: 2}
});//1 megabyte

app.post("/upload", upload.array("file"), (req, res) => {
  res.status(200).json({success: true}); 
})

// error handling middleware
app.use((error, req, res, next)=>{
  if (error instanceof multer.MulterError) {
    if(error.code==="LIMIT_FILE_SIZE") {
      return res.json({message: "file limit reached."
    	});
  	}
    
    if(error.code === "LIMIT_FILE_COUNT"){
      return res.json({message: "file is too large."
    	});
  	}
    
    if(error.code === "LIMIT_UNEXPECTED_FILE"){
      return res.json({message: "file must be an image."
    	});
  	}
})

app.listen(4000, () => console.log("listening on port 4000")); 
#consol.log(multiUpload())
{
	fieldname: 'resume',
    originalname: 'resume.jpg',
    encoding: '7bit',
    mimetype: 'image/jpeg',
    destination: 'uploads/',
    filename: 'bd37650a5112d9cb8f9gc600207306d',
    path: 'uploads//bd37650a5112d9cb8f9gc600207306d',
    size: 44692
}
profile
황세민

0개의 댓글