[node.js]AWS S3로 이미지 업로드 하기

여리·2023년 4월 8일
0

s3 파일의 업로드 경우는 대체로 미들웨어로 사용되는 경우가 많습니다.
이번 이미지를 업로드를 하는데 있어서 필요한 조건들은 아래와 같습니다.
하지만 여기서 참고해야할 것은 이 미들웨어의 경우는 file이라는 하나의 파일만 업로드가 가능하다는 점입니다.
여러개의 파일을 업로드해야하는 경우는 코드내용이 달라질 수 있으니 참고해야합니다!
여러개의 파일을 업로드해야하는 경우는 아래에 추가로 작성해 보았다.

조건

AWS 모듈과 multer, multer-s3, uuid4 모듈을 import 합니다.
AWS 모듈을 사용하기 위해, AWS 계정 정보를 설정합니다.
s3 객체를 생성하여, S3와 연결합니다.
multer-s3 모듈을 사용하여, AWS S3에 파일을 업로드하기 위한 설정을 합니다.
multer 모듈을 사용하여, 파일 업로드 객체를 생성합니다.
upload 객체를 export 하여, 파일 업로드를 수행할 수 있도록 합니다.
deleteImage 함수를 작성하여, S3에서 이미지를 삭제할 수 있도록 합니다.

 const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const uuid = require('uuid4');

AWS.config.update({
  region: 'ap-northeast-2',
  accessKeyId: process.env.S3_ACCESS_KEY,//accessKeyId의 경우는 공개되지 않도록 환경변수로 설정
  secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,//secretAccessKey도 공개되지 않도록 환경변수 설정
});

const s3 = new AWS.S3();

// AWS S3 업로드 설정
const storage = multerS3({
  s3, // AWS S3 연결
  acl: 'public-read', // S3 Bucket의 객체에 대한 읽기 권한
  bucket: '${버킷이름}', // S3 Bucket의 이름
  contentType: multerS3.AUTO_CONTENT_TYPE, // 파일 MIME 타입 자동 지정
  key: (req, file, cb) => {
    // 파일 이름 생성 및 반환
    cb(null, Date.now().toString() + uuid() + file.originalname);
  },
});

// 파일 업로드 객체 생성
const upload = multer({
  storage, // 파일 스토리지 설정
  limits: { fileSize: 5 * 1024 * 1024 }, // 파일 크기 제한
  defaultValue: { path: '', mimetype: '' }, // 기본 값
});

// S3에서 이미지 삭제
const deleteImage = (fileKey) => {
  s3.deleteObject(
    {
      Bucket: '${버킷이름}', // S3 Bucket의 이름
      Key: fileKey, // 삭제할 파일의 키 (경로 및 파일 이름)
    },
    (err, data) => {
      if (err) {
        throw err; // 삭제 실패 시 에러 발생
      } else {
        console.log('Image Deleted'); // 삭제 성공 시 로그 출력
      }
    }
  );
};

module.exports = { upload, deleteImage };

파일 여러개를 업로드 하는 경우

파일 업로드를 여러 개 처리하는 경우 multer에서 제공하는 array나 fields를 사용하여 upload를 다르게 설정해주어야 합니다.

array는 하나의 input name에서 여러 파일을 받을 때 사용하며, fields는 서로 다른 input name에서 파일을 받을 때 사용합니다.

array

array는 files라는 input name을 가진 파일들을 최대 10개까지 받도록 설정한 것입니다.

const upload = multer({
  storage,
  limits: { fileSize: 5 * 1024 * 1024 },
}).array('files', 10);

fields

fields를 사용하여 profile과 photos 두 개의 input name에서 파일을 받도록 설정한 것입니다. profile은 최대 1개, photos는 최대 10개까지 받을 수 있도록 설정되어 있습니다.

const upload = multer({
  storage,
  limits: { fileSize: 5 * 1024 * 1024 },
}).fields([
  { name: 'profile', maxCount: 1 },
  { name: 'photos', maxCount: 10 },
]);

다중이미지 저장을 위한 전체 소스코드

const AWS = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');
const uuid = require('uuid4');

AWS.config.update({
  region: 'ap-northeast-2',
  accessKeyId: process.env.S3_ACCESS_KEY,
  secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
});

const s3 = new AWS.S3();

// AWS S3 업로드 설정
const storage = multerS3({
  s3,
  acl: 'public-read',
  bucket: '${버킷이름}',
  contentType: multerS3.AUTO_CONTENT_TYPE,
  key: (req, file, cb) => {
    // 파일 이름 생성 및 반환
    cb(null, `${Date.now().toString()}_${uuid()}_${file.originalname}`);
  },
});

// 파일 업로드 객체 생성
const upload = multer({
  storage,
  limits: { fileSize: 10 * 1024 * 1024 }, // 최대 10MB 파일 업로드 허용
}).array('images'); // 여러 파일 업로드를 지원하는 `multer.array()` 사용

// S3에서 이미지 삭제
const deleteImage = (fileKey) => {
  s3.deleteObject(
    {
      Bucket: '${버킷이름}',
      Key: fileKey,
    },
    (err, data) => {
      if (err) {
        throw err;
      } else {
        console.log('Image Deleted');
      }
    }
  );
};

module.exports = { upload, deleteImage };

이 코드는 AWS SDK, Multer, Multer-S3, UUID4를 사용하여 S3 버킷에 파일을 업로드하고, 파일을 삭제하는 기능을 제공합니다.

먼저 AWS SDK를 사용하여 S3 버킷에 접근하고, Multer-S3를 사용하여 파일을 업로드합니다. 이때 파일의 ACL은 public-read로 설정되며, 파일의 Content-Type은 자동으로 감지됩니다. 업로드된 파일은 UUID4를 사용하여 고유한 파일명이 부여되고, 업로드 시간이 파일명 앞에 추가됩니다. 파일의 최대 크기는 5MB로 제한됩니다. 파일의 최대 크기나, 파일의 확장자(jpg,png,bmp,avi 등)의 제한은 소스코드 내에서 제한이 가능합니다.

또한 deleteImage 함수는 S3 버킷에서 지정된 파일을 삭제하는 기능을 제공합니다. 파일의 경로는 S3 버킷 내에서의 Key 값으로 지정됩니다.

코드 자체는 깔끔하고 간결한 편이며, 주석이 없어도 이해하기 쉽습니다. 단, 환경 변수로 S3_ACCESS_KEY와 S3_SECRET_ACCESS_KEY를 사용하는데, 이 값들이 환경 변수에 설정되어 있지 않으면 코드가 실행되지 않습니다. 이 점을 주의해서 사용하셔야 합니다.

profile
beckend developer

0개의 댓글