아무거나

NodeJS 를 사용하여 S3 에 File upload (파일 업로드) 기능 구현 본문

Javascript & HTML & CSS/NodeJS

NodeJS 를 사용하여 S3 에 File upload (파일 업로드) 기능 구현

전봉근 2022. 12. 3. 11:22
반응형

S3 에 File Upload 기능 구현

  • 라이브러리 설치
    $ npm install multer
    $ npm install aws-sdk
    
  • File Upload Util
    const fs = require("fs")
    const path = require("path")
    const multer = require("multer")
    
    /**
    * Save For File Upload (Use Multer Module)
    */
    export const saveForFileUpload = multer({
      storage: multer.diskStorage({
        destination(req, file, done) {
          const dirPath = path.resolve("./") + "\\uploads"
          if (!fs.existsSync(dirPath)) {
            fs.mkdirSync(dirPath, { recursive: true })
          }
    
          done(null, "uploads/")
        },
        filename(req, file, done) {
          // 파일명을 어떤 이름으로 올릴지
          const ext = path.extname(file.originalname) // 파일의 확장자
          done(null, path.basename(file.originalname, ext) + "_" + Date.now() + ext)
        },
      }),
      limits: { fileSize: 5 * 1024 * 1024 },	// 파일 사이즈 설정
    })
  • S3 File Upload Util
    const fs = require("fs")
    const AWS = require("aws-sdk")
    
    export const s3FileUpload = async (reqFile) => {
      const result = new Object()
    
      AWS.config.update({
        accessKeyId: {accessKeyId},
        secretAccessKey: {secretAccessKey},
        region: "ap-northeast-2",
      })
      const s3 = new AWS.S3()
    
      const fileContent = fs.readFileSync(reqFile.path)
    
      const param = {
        Bucket: {bucket path},
        Key: reqFile.filename,
        ACL: "public-read-write",
        Body: fileContent,
        ContentType: reqFile.mimetype,
      }
    
      try {
        const data = await s3.upload(param).promise()
        result.file = param
        result.uploadResult = data
        result.reqFile = reqFile
      } catch (err) {
        console.log(err)
      }
    
      return result
    }
  • API 생성
    // File 은 formdata 형식으로 uploadFile 값으로 넘김
    app.post(
      `fileUpload`,
      saveForFileUpload.single("uploadFile"),
      async (req, res) => {
        await s3FileUpload(req.file)
      }
    )
    
반응형
Comments