← Dev Log

S3 이미지 업로드 기능 구현

·3 min read

오늘 한 일

  • gloddy 프로젝트
    • 게시글 상세 페이지 구현
  • 카공실록 프로젝트
    • S3 이미지 업로드 기능 구현

S3 이미지 업로드 기능 구현

클라이언트 -> S3 이미지 업로드 -> 서버 -> DB 저장(이미지 url)

AWS를 사용하는건 처음이라서 많이 헤맸다..

S3에 버킷을 생성하고 이것저것 권한을 세팅해줬다.


그다음 클라이언트에서 S3에 업로드를 해야한다.

나는 aws-sdk를 사용했다.

import AWS, { S3 } from 'aws-sdk'

AWS.config.update({
  accessKeyId: process.env.NEXT_PUBLIC_AWS_ACCESS_KEY as string,
  secretAccessKey: process.env.NEXT_PUBLIC_AWS_SECRET_KEY as string,
})

const myBucket = new AWS.S3({
  params: { Bucket: process.env.NEXT_PUBLIC_AWS_BUCKET_NAME as string },
  region: process.env.NEXT_PUBLIC_AWS_REGION as string,
})

export const uploadImage = async (file: File, folderName: string) => {
  if (!file) {
    return
  }

  const params: S3.Types.PutObjectRequest = {
    Bucket: process.env.NEXT_PUBLIC_AWS_BUCKET_NAME as string,
    Key: folderName + '/' + file.name,
    Body: file,
    ACL: 'public-read',
    ContentType: file.type,
  }

  const data = await myBucket.putObject(params).promise()

  return data
}

export const uploadImages = async (files: File[], folderName: string) => {
  const promises = files.map((file) => uploadImage(file, folderName))

  const data = await Promise.all(promises)

  return data
}

처음에 url을 클릭했을 때 다운로드가 되는 문제가 있었다. 알고보니 contentType을 설정해주지 않아서 그런 것이었다. 수정하니 잘 되었다.

서버에서 요구하는 데이터 형식

{
  url: string,
  width: number,
  height: number,
  extension: string
}

근데 S3에서 받아오는 데이터는 width, height가 없었다.

따로 구할 수는 있겠지만, 일단 백엔드와 협의해서 다른 방향으로 할 수 있도록 얘기를 해봐야겠다.


내일 할 일

  • 마지막 TS 스터디
  • 카공실록 이미지 api 연결
  • gloddy PR 리뷰 및 수정