• 로그인
  • 장바구니에 상품이 없습니다.

home2 게시판 Next.js 게시판 next 이미지 업로드기능2 에서 질문 있습니다.

next 이미지 업로드기능2 에서 질문 있습니다.

8 글 보임 - 1 에서 8 까지 (총 8 중에서)
  • 글쓴이
  • #108259

    김태훈
    참가자
    write/page.js
    import { getServerSession } from 'next-auth/next'
    import { authOptions } from '@/pages/api/auth/[...nextauth]'
    import WriteElements from './WriteElements'
    export default async function Write(){
      let session = await getServerSession(authOptions)
      return (
        <div>
          {
            session ? <WriteElements/> : <div>로그인해라</div>
          }
        </div>
      )
    }
    
    
    writeElements
    
    'use client'
    import { useSession } from "next-auth/react"
    import { useState } from "react"
    export default function WriteElements(){
      let [src, setSrc] = useState('')
      return(
        <div className="p-20">
          <h4>글작성</h4>
          <form action="/api/post/new" method="POST">
            <input name="title" placeholder="글제목"/>
            <input name="content" placeholder="글내용"/>
            <input type="file" accept="image/*"
              onChange={async(e)=>{
                let file = e.target.files[0]
                let filename = encodeURIComponent(file.name)
                let res = await fetch(`/api/post/image?file=${filename}`)
                res = await res.json()
                console.log(res)
                //S3 업로드
                const formData = new FormData()
                Object.entries({ ...res.fields, file }).forEach(([key, value]) => {
                  formData.append(key, value)
                })
                let 업로드결과 = await fetch(res.url, {
                  method: 'POST',
                  body: formData,
                })
                console.log(업로드결과)
                if (업로드결과.ok) {
                  setSrc(업로드결과.url + '/' + filename)
                } else {
                  console.log('실패')
                }
              }}
            />
            < img src={src}/>
            <button type="submit">전송</button>
          </form>
        </div>
      )
    }
    
    api/post/image.js
    
    
    import aws from 'aws-sdk'
    export default async function handler(request, response){
      aws.config.update({
        accessKeyId: process.env.ACCESS_KEY,
        secretAccessKey: process.env.SECRET_KEY,
        region: 'ap-northeast-2',
        signatureVersion: 'v4',
      })
      const s3 = new aws.S3();
      const url = await s3.createPresignedPost({
        Bucket: process.env.BUCKET_NAME,
        Fields: { key : request.query.file },
        Expires: 60, // seconds
        Conditions: [
          ['content-length-range', 0, 1048576], //파일용량 1MB 까지 제한
        ],
      })
      response.status(200).json(url)
    }
    
    현재 코드는 이렇게 돼있고 이미지 업로드해서 미리보기 띄우려는데 
    POST https://s3.ap-northeast-2.amazonaws.com/taenge 403 (Forbidden) 라는 오류가 계속 뜨면서 
    미리보기도 안되고 실패라는 문구만 나옵니다 ㅠㅠ
    
    
    
    
    #108262

    codingapple
    키 마스터
    s3들어가서 설정이랑 권한부여 잘 되어있나 확인해봅시다
    #108265

    김태훈
    참가자
    버킷 정책
    
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "1",
                "Effect": "Allow",
                "Principal": "*",
                "Action": "s3:GetObject",
                "Resource": "arn:aws:s3:::taenge/*"
            },
            {
                "Sid": "2",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::654953291727:root"
                },
                "Action": [
                    "s3:PutObject",
                    "s3:DeleteObject"
                ],
                "Resource": "arn:aws:s3:::taenge/*"
            }
        ]
    }
    
    
    CORS
    
    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "PUT",
                "POST"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "ExposeHeaders": [
                "ETag"
            ]
        }
    ]
    
    이렇게 설정돼있습니다
    #108296

    codingapple
    키 마스터
    acl이나 퍼블릭액세스도 설정잘해놨나 확인합시다 
    아니면 arn:aws:iam::654953291727:root 이게 틀렸을수도요
    #108669

    김태훈
    참가자
    acl 비활성화도 했고 퍼블릭 액세스 가능이라고 뜹니다ㅠㅠ
    혹시 몰라서 새로 버킷 만들어서 해봤는데도 콘솔에
    
    WriteElements.js:28 부분
    
    let 업로드결과 = await fetch(res.url, {
                  method: 'POST',
                  body: formData,
                })
    
    이부분에서 
    POST https://s3.ap-northeast-2.amazonaws.com/taenimg 403 (Forbidden)
    이 에러메시지와 실패라는 콘솔이 찍힙니다 ㅠㅠ
    
    
    #108684

    codingapple
    키 마스터
    만든 버킷 이름이 taenimg 인지 taenge 인지 확인해봅시다 두개 섞어써서그럴수도요
    #108687

    김태훈
    참가자
    현재 taenimg 버킷 사용중이고 env 버킷이름, 정책 다 taenimg로 수정돼있습니다
    엑세스 키랑 비밀번호도 모두 확인했습니다
    #108716

    codingapple
    키 마스터
    업로드하려는 이미지 용량이 1mb 안넘나 확인해봅시다
8 글 보임 - 1 에서 8 까지 (총 8 중에서)
  • 답변은 로그인 후 가능합니다.

About

현재 월 700명 신규수강중입니다.

  (09:00~20:00) 빠른 상담은 카톡 플러스친구 코딩애플 (링크)
  admin@codingapple.com
  이용약관
ⓒ Codingapple, 강의 예제, 영상 복제 금지
top

© Codingapple, All rights reserved. 슈퍼로켓 에듀케이션 / 서울특별시 강동구 고덕로 19길 30 / 사업자등록번호 : 212-26-14752 온라인 교육학원업 / 통신판매업신고번호 : 제 2017-서울강동-0002 호 / 개인정보관리자 : 박종흠