S3에 이미지 업로드해서 프로필 사진 DB에 넣기

test.html

function upload() {
  const imageInput = $('#imageInput')[0]
  // 파일을 여러개 선택할 수 있으므로 files 라는 객체에 담긴다.
  console.log('imageInput: ', imageInput.files)

  if (imageInput.files.length === 0) {
    alert('파일은 선택해주세요')
    return
  }

  const formData = new FormData()
  formData.append('profile_image', imageInput.files[0])

  $.ajax({
    type: 'POST',
    url: 'http://localhost:3000/api/upload',
    processData: false,
    contentType: false,
    data: formData,
    headers: {
      Authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiJmYW5jeWVyIiwiaWF0IjoxNjQ1MDkwNTQyfQ.unU3PcIWsnm7svuqZbW9QEqX_4XIEAlFf-HWWpacEmg'
    },
    success: function (rtn) {
      const message = rtn.data.values[0]
      console.log('message: ', message)
      $('#resultUploadPath').text(message.uploadFilePath)
    },
    err: function (err) {
      console.log('err:', err)
    },
  })
}
<form id="uploadForm" enctype="multipart/form-data">
  <input type="file" id="imageInput" />
</form>
<button onclick="upload()">업로드</button>

multer.js

const multer = require('multer')
const multerS3 = require('multer-s3')
const aws = require('aws-sdk')
aws.config.loadFromPath(__dirname + '/../s3.json')

const s3 = new aws.S3()
const upload = multer({
  storage: multerS3({
    s3: s3,
    bucket: 'mini-project-image-upload',
    acl: 'public-read',
    contentType: multerS3.AUTO_CONTENT_TYPE,
    key: function (req, file, cb) {
      cb(
        null,
        `${Date.now()}_profile_picture` +
          '.' +
          file.originalname.split('.').pop()
      )
    },
  }),
})
module.exports = upload

profile-image.js

const express = require('express')
const User = require('../models/user')
const router = express.Router()
const authMiddleware = require('./auth-middleware')
const upload = require('../modules/multer')

// 프로필 이미지 업로드
router.post('/upload', authMiddleware, upload.single('profile_image'), async (req, res) => {
    const userId = res.locals.user[0].userId
    const profileImageUrl = req.file.location

    const user = await User.findOne({ userId })
    user.profileImageUrl = profileImageUrl
    await user.save()

    res.send({})
})

// 프로필 사진 보여주기
router.post('/profile_image', authMiddleware, async (req, res) => {
    const userId = res.locals.user[0].userId
    const user = await User.findOne({ userId })
    const profileImageUrl = user.profileImageUrl

    res.json({ profileImageUrl })
})

module.exports = router

좋은 웹페이지 즐겨찾기