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

bubblegum·2024년 2월 11일

NodeJS

목록 보기
13/14
post-thumbnail
  1. AWS S3 bucket 생성하기(bucket 이름 복사)

  2. IAM policies 생성하기
    1) detail
    (1) servies: "S3"
    (2) action: Get Object, Put Object, Delete Object, Get Object Attributes
    (3) resource: specific
    (4) Add ARN
    - Bucket name: 복사 붙여넣기
    - Object name * (Any)
    2) next tags
    3) next review
    (1) Review Policy
    - name:
    4) create policy

  3. Add User
    1) set user detail
    (1) user name
    (2) select AWS credencial type: Access Key
    2) set permission
    (1) Attach existing policies directly
    (2) Filter policies: policy name select
    3) next review
    4) Create User
    (1) Download .csv click

  4. aws-sdk 설치하기

npm install aws-sdk
  1. Loading Credentials in Node.js from Environment Variables(.env 파일을 다음과 같이 작성)
// .env

AWS_ACCESS_KEY_ID = 
AWS_SECRET_ACCESS_KEY = 
AWS_REGION = 
AWS_BUCKET_NAME = 
  1. s3Service.js 파일 만들기
// s3Service.js

const {s3} = require("aws-sdk");
const uuid = require("uuid").v4;

exports.s3Uploadv2 = async(file) => {
  const s3 = new s3();
  
  const param = {
  	Bucket: process.env.AWS_BUCKET_NAME,
    key: `uploads/${uuid()}-${file.originalname}`,
    Body: file.buffer
  };
  
  return await s3.upload(param).promise();
}
  1. index.js 파일을 다음과 같이 수정
// index.js
require("dotenv").config();
const express = require("express");
const multer = require("multer");
const uuid = require("uuid").v4; 

const app = express(); 

// custom filename
const storage = multer.memoryStorage({ 
  // memoryStorage(): 업로드된 파일을 메모리에 저장하는 방법을 지정하는 함수. 업로드된 파일을 버퍼로 저장하며, 파일 시스템에 저장하지 않고도 파일을 처리할 수 있게 함.
  destination: (req, file, cb) => {
  	cb(null, "uploads"); // error가 없을 경우 null을 반환하고 파일을 업로드함.
  },
  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);
  }
};
  
//["image", "jpeg"]

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

app.post("/upload", upload.array("file"), async (req, res) => {
  const file = req.files[0];
  const result = await s3Uploadv2(file);
  res.status(200).json({success: true, result}); 
})

// 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")); 
profile
황세민

0개의 댓글