[Node.js] AWS multer-s3 사용, multer 이용시 req.body가 undefined로 나오는 경우

bbio3o·2021년 5월 24일
0

Node.js

목록 보기
2/2
post-thumbnail

1. multer 이용시 req.body가 undefined로 나오는 경우

multer를 이용해 파일을 전송하고, req.body로 다른 필드정보를 가져오고 싶다면, 요청 순서가 중요합니다.
보내려는 파일보다 필드를 항상 먼저 받아와야 합니다.

스택오버플로우 참고


2. multer-s3를 이용한 파일 업로드 middleware

const path = require('path');
const aws = require('aws-sdk');
const multer = require('multer');
const multerS3 = require('multer-s3');

aws.config.update({
  secretAccessKey: process.env.AWSSecretKey,
  accessKeyId: process.env.AWSAccessKeyId,
});

const s3 = new aws.S3();

const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: '버킷이름',
    acl: 'public-read',
    metadata: (req, file, cb) => {
      cb(null, { fieldName: file.fieldname });
    },
    key: (req, file, cb) => {
      const extension = path.extname(file.originalname);

      const setDirectory = (id, field) => {
        return `dev/${id}/${field}`
      }

      const fullPath = setDirectory(req.body.id, req.body.fileName) + Date.now() + extension;
      cb(null, fullPath);
    },
  }),
});

module.exports = upload;

3. aws s3 객체 삭제

const params = {
  Bucket: '버킷이름',
  Key: delFileKey
}
s3.deleteObject(params, function(err, data) {
  if (err) {
    console.log('aws s3 delete error')
  } else {
    console.log('aws s3 delete success');
  }
})

3. aws s3 폴더 삭제

aws s3 에서 콘솔이나, 파일경로를 보면 s3에 directory로 구성되는거 같지만 사실상 폴더의 개념은 없습니다.
모든 것이 하나의 파일 object의 개념이기 때문에
폴더를 삭제하여 해당 경로 하위 파일 객체들과 함께 모두 지우기 위해서는
경로 하위에 존재하는 파일객체 목록을 조회한 후 deleteObject가 아닌 deleteObjects로 제거해주어야 합니다.

async function emptyS3Directory(bucket, dir) {
    const listParams = {
        Bucket: bucket,
        Prefix: dir
    };

    const listedObjects = await s3.listObjectsV2(listParams).promise();

    if (listedObjects.Contents.length === 0) return;

    const deleteParams = {
        Bucket: bucket,
        Delete: { Objects: [] }
    };

    listedObjects.Contents.forEach(({ Key }) => {
        deleteParams.Delete.Objects.push({ Key });
    });

    await s3.deleteObjects(deleteParams).promise();

    if (listedObjects.IsTruncated) await emptyS3Directory(bucket, dir);
}

// call it:
// 삭제하려는 폴더경로뒤에 꼭 / 붙여줘야함

await emptyS3Directory('버킷이름', '삭제하려는 폴더경로/')
profile
그림도 그리는 개발자 🎨👩‍💻

0개의 댓글