이미지 업로드 방법

LEE JI YOUNG·2022년 2월 24일
0

에러핸들링

목록 보기
1/24

썸네일 만들기

 //-------------(join.js)이미지------------
  let [imgBase64, setImgBase64] = useState(null); 
let [profileImg, setProfileImg] = useState(null);
  //이미지 업로드 버튼 실행함수
  const handleChangeUpload = (e) => {
    const uploadFile = e.target.files[0]
    setThumbnail(uploadFile); // 썸네일 만들기
    const formData = new FormData();
    formData.append('profileImage', uploadFile);
    if(formData) {
      setProfileImg(formData);
    }
  };
  //이미지 삭제버튼 실행함수
  const handleClickDeleteImg = (e) => {
    setProfileImg(null);
  }
  // 썸네일 만드는 함수
  const setThumbnail = (fileBlob) => {
    const reader = new FileReader();
    reader.readAsDataURL(fileBlob); 
    return new Promise((resolve) => { 
      reader.onload = () => { 
        setImgBase64(reader.result); 
        resolve(); 
      }; 
    });
  }
 <div className="btn_list">
                <label htmlFor='image' className='upload_btn profile_btn'>
                  <input id='image' type='file' accept='image/*' className='input_hidden' onChange={handleChangeUpload}/>
                  이미지 업로드
                </label>
                <div className='delete_btn profile_btn' onClick={handleClickDeleteImg}>이미지 제거</div>
              </div>

이미지 파일 업로드

https://velog.io/@gay0ung/%EB%A6%AC%EC%95%A1%ED%8A%B8%EB%A1%9C-%EC%9D%B4%EB%AF%B8%EC%A7%80-%EC%97%85%EB%A1%9C%EB%93%9C-%EB%AF%B8%EB%A6%AC%EB%B3%B4%EA%B8%B0

-문제상황 :
file 형식의 객체로만 전송하면 되는줄 알았는데 계속 빈객체가 전송되었다.

-해결방법 :

const uploadFile = e.target.files[0]
    const formData = new FormData();
    formData.append('profileImage', uploadFile);
    const config = {
      Headers: {
        'content-type': 'multipart/form-data',
      }
    }
    console.log(formData)
      if (formData) {
        // const uploadFile = e.target.files[0];
        
        axios.put(
          'http://localhost:3001/users/profile-image', formData, config
        )

const formData = new FormData(); 해서 FormData 형식을 만들어주고 그안에 append로 formData.append('profileImage', uploadFile) 키 - 값을 넣어준다.

      Headers: {
        'content-type': 'multipart/form-data',
      }
    }

을 요청해더에 추가해주어 기존의
Content-Type: application/json 인 데이터를 Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryT2qC6LDM8gOeffPY 로 바꿔주었다. !!!

  • 원인 :

추가 공부

  • axios 전송방법

https://tuhbm.github.io/2019/03/21/axios/

: 서버의 자세한 코드까지는 설명하는게 과할거 같아 기본적인 logic만 소개를 하자면, 아이디와 비밀번호가 서버로 넘어오면 유저의 정보가 맞는지 확인한 후에 cookie에 token을 발급하게 됩니다.

그 후 다른 페이지에서의 인증도 이 token을 통해 이뤄지게 되죠.

하지만 통신이 아무리 성공적으로 이뤄져 로그인이 성공하더라도 별다른 에러도 없이 인증이 이루어지지 않았습니다.

확인 결과, cookie에 token 값이 정상적으로 들어가지가 않았습니다.

같은 origin의 경우 request header 에 cookie가 추가되는데 orgin이 달라지는 경우 자동으로 추가되지 않아 생기는 문제점이었습니다.

이를 해결하기 위해서는 서버와 클라이언트 둘 다 추가적인 작업이 필요합니다.

profile
프론트엔드 개발자

0개의 댓글