nextjs api routes & s3 presignedurl

김명성·2023년 12월 7일
// api/s3-bucket/route.ts
import { BUCKET_NAME, s3 } from '@/aws/s3/S3Instance'
import { PutObjectCommand, ListObjectsCommand } from '@aws-sdk/client-s3'
import { NextRequest, NextResponse } from 'next/server'

export async function GET() {
  const response = await s3.send(new ListObjectsCommand({ Bucket: BUCKET_NAME }))
  return NextResponse.json(response?.Contents ?? [])
}

export const POST = async (req: NextRequest) => {
  const formData = await req.formData()
  const files = formData.getAll('file') as File[]

  const response = await Promise.all(
    files.map(async file => {
      const Body = (await file.arrayBuffer()) as Buffer
      s3.send(new PutObjectCommand({ Bucket: BUCKET_NAME, Key: file.name, Body }))
    }),
  )

  return NextResponse.json(response)
// api/s3-bucket/[key]/route.ts
import { getSignedUrl } from '@aws-sdk/s3-request-presigner'
import { GetObjectCommand } from '@aws-sdk/client-s3'
import { NextResponse } from 'next/server'
import { BUCKET_NAME, s3 } from '@/aws/s3/S3Instance'

export async function GET(_: Request, { params }: { params: { key: string } }) {
  const command = new GetObjectCommand({ Bucket: BUCKET_NAME, Key: params.key })
  const src = await getSignedUrl(s3, command, { expiresIn: 3600 })

  return NextResponse.json({ src })
}
// aws/s3/s3Instance.tsx
import { S3Client } from '@aws-sdk/client-s3'

const BUCKET_NAME = process.env.AWS_BUCKET_NAME

const s3 = new S3Client({
  region: process.env.AWS_S3_BUCKET_REGION,
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID as string,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY as string,
  },
})

export { s3, BUCKET_NAME }

0개의 댓글