티스토리 뷰

반응형

 

안녕하십니까 이번에는 NodeJS에서 AWS SDK를 이용한 S3 파일 업로드를 하는 법을 작성하겠습니다!

우선 파일 업로드에 관해서는 Multer를 이용한 File Upload 글을 참조해주세요!

AWS S3 업로드에도 Multer라이브러리가 필요합니다. Multer라이브러리가 폼데이터를 파싱해주는 역할을 하기 때문입니다.

 

사실 Multer-S3를 이용하면 쉽게 업로드 할 수 있습니다. 하지만 저는 서비스단에서 직접 핸들링을 하기 위해서 방법을 찾다가 multer로 formdata만 받아주고 서비스단에서 할 수 있어서 이렇게 진행을 했습니다.

 

우선 Node.js에서 AWS SDK를 이용하기 위해선 pakage.json에 추가를 해줘야 합니다!

저는 typescript로 개발할거라 typescript도 추가해줬습니다.

{
  "dependencies": {
    "aws-sdk": "^2.585.0",
    "multer": "^1.4.2",
  },
  "devDependencies": {
    "@types/aws-sdk": "^2.7.0",
    "@types/multer": "^1.3.10",
    "tslint": "^5.20.1",
    "typescript": "^3.7.2"
  }
}

 

Multer-S3 글은 아니지만 간단한 코드를 보여드리자면 다음과 같습니다.

 

import express from "express";
import AWS from "aws-sdk";
import multer = require("multer");
import multerS3 = require("multer-s3");

// AWS SDK 설정
const s3 = new AWS.S3({
  accessKeyId: config.AWS.S3.ACCCESSKEY,
  secretAccessKey: config.AWS.S3.SECRET.ACCCESSKEY
});

export const s3Storage = multerS3({
  s3: s3,
  // 파일 저장될 버켓 위치
  bucket: config.AWS.S3.BUCKET,
  key: (req, file, cb) => {
  	  // key 위치 
      cb(null, "Images/" + date + "/" + file.originalname);
    }
});

// multer에 저장 위치 설정
export const upload = multer({
  storage: s3Storage,
});

// multer가 동작될 핸들러 등록
export default express
  .Router()
  .post(
    "/upload",
    [upload.array("files", 10)]
  )

 

사실 위의 코드로 작성 후 Service단에서 저장만 해도 되는데,

저는 에러 핸들링가지 처리하고 싶어서 Service단에서 Upload를 진행하고 싶었습니다.

 

이제는 서비스단에서 핸들링을 해보겠습니다.

 

import AWS from "aws-sdk";
import multer from "multer";
import PostController from "./post.controller";

export const s3 = new AWS.S3({
    accessKeyId: config.AWS.S3.ACCCESSKEY,
    secretAccessKey: config.AWS.S3.SECRET.ACCCESSKEY,
});

// formdata의 files라는 key를 가져옴
export const upload = multer({
  }).array("files");

// upload(files)를 파싱 후 next()를 통해 PostController에 넘겨줌
export default express.Router()
.post("/upload", (req, res, next) => { upload(req, res, (err) => { next(); });
                            }, PostController.uploadPost);

 

PostController.ts

class PostController {
  /**
   *  업로드 포스트 - /post/upload
   */
  async uploadPost(req: express.Request, res: express.Response) {
		const postFileInfo = await s3upload(files as TUpload);
        res.status(200).send(r);
  }

s3Upload 부분

import { s3 } from "../components/post/post/router";
import { config } from "../config/connection";

export type TUpload =  {
    [fieldname: string]: Express.Multer.File[] | Express.MulterS3.File[];
  } | Express.Multer.File[] | Express.MulterS3.File[];

export const s3upload = (files: TUpload): Promise<any> => {
    return new Promise(async (resolve, reject) => {
        try {
          for (let i = 0; i < files.length ; i++ ) {
            const uploadParams = {
                Bucket: config.AWS.S3.BUCKET,
                Body: files[i].buffer, // 
                Key: `저장될 key 파일명`,
              };
            // s3 upload .promise() 호출로 Promise 이용할 수 있음
            s3.upload(uploadParams, (err, data) => {
              if (err) { reject(err); return; }
              if (data === undefined) {
                reject(new Error("Fail to file upload"));
              } else {
              	resolve(200);
              }
            });
          }
        } catch (err) {
          reject(err);
        }
    });
};

 

 

서비스 단에서 핸들링을 하면 파일 업로드는 위의 코드처럼 진행되면 됩니다.

물론 저 사이에 비즈니스 로직을 넣는다거나, 필요한 코드들을 추가할 수 있겠죠? 좀 더 완벽하게 하려고 하면 파일 업로드가 정상적으로 됬다 확인까지 해주면 좋구요.

 

다음에는 AWS S3 스르리밍 다운로드(이동)를 작성해보도록 하겠습니다!

그럼 이만.

 

 

 

 

참고 및 출처

 

multer

https://github.com/expressjs/multer

aws s3 문서

https://docs.aws.amazon.com/ko_kr/sdk-for-javascript/v2/developer-guide/s3-example-creating-buckets.html

반응형

'BackEnd > Node.js' 카테고리의 다른 글

Node.js Tip  (0) 2020.03.15
node.js 공개키(비밀키) 암호화(A Key Pair)  (0) 2020.03.08
type check with typescript  (0) 2019.10.23
nods.js Request를 이용한 외부 api 호출  (0) 2019.08.17
FCM Silent Push  (0) 2019.08.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함