안녕하세요 ! 오늘은 이미지를 웹사이트에 업로드해볼 건데요. 기능은 두가지를 구현해볼 겁니다.
- 이미지를 웹사이트에 올려 미리보기
- 이미지를 백엔드 서버에 전송하기
우선, input과 label을 세팅해봅시다. input에 type="file"을 그냥 사용하면
위처럼 못생긴 '파일 선택'화면이 나타나게 됩니다. 이런 못생긴 화면을 감추기 위해 input요소는 display:none;
을 통해 감추고 label요소만 보이게 할 것입니다,
<S.ModalSelectInput
id="pick_in_gallery"
type="file"
accept="image/*"
onChange={onUploadImage}
/>
<S.ModalSelectLabel htmlFor="pick_in_gallery">갤러리에서 사진 선택</S.ModalSelectLabel>
label을 클릭하면 input이 실행되도록 하기 위해 input요소의 id와 label의 htmlFor을 동일시 합니다. 그리고 input의
type="file"
,accept="image/*"
을 통해 파일 중 이미지 파일만 입력받도록 합니다. label을 클릭하면 input이 실행되도록 하기 위해 input요소의 id와 label의 htmlFor을 동일시 합니다. 그리고 input의type="file"
,accept="image/*"
을 통해 파일 중 이미지 파일만 입력받도록 합니다.label을 원하는 대로 꾸몄다면, 이제 세팅은 끝났습니다. JS를 이용하여 파일을 업로드하면 됩니다. input의 onChange속성으로 onUploadImage함수를 전달하였습니다.
저희가 사용할 것은 FileReader객체입니다. FileReader객체는 웹 애플리케이션이 비동기적으로 데이터를 읽기 위하여 읽을 파일을 가리키는 File 객체를 이용해 파일의 내용을 읽고 사용자의 컴퓨터에 저장하는 것을 가능하게 해줍니다.(참고)
- FileReader.error ; 파일을 읽는 도중에 발생한 오류 나타냄
- FileReader.readyState ; FileReader의 상태를 나타내는 숫자 0 ; 아직 데이터 로드되지 않음 1 ; 데이터 로딩 중 2 ; 데이터 로드 완료
- FileReader.reulst ; 파일의 컨텐츠. 파일 읽기에 성공하면 여기에 저장됨
- FileReader.onAbort ; 읽기 동작이 중단될 때마다 발생
- FileReader.onerror ; 읽기 동작에 에러가 생길 때마다 발생
- FileReader.onload ; 읽기 동작이 성공적으로 완료될 때마다 발생. 비동기이므로 원하는 동작을 위해 Callback함수 혹은 async-await를 이용하는 것이 좋습니다.
const onUploadImage = useCallback(async (e) => {
if (!e.target.files) {
return;
}
const reader = new FileReader();
reader.onload = () => {
const dataURL = reader.result;
localStorage.setItem("profileImgData", dataURL);
};
}, []);
FileReader객체를 생성해줍니다. 그리고 FileReader.onLoad메서드를 이용하여 dataURL을 얻어옵니다. 그리고 localStorage에 저장해주었습니다. 이 dataURL을
<img />
의 src속성에 넘겨주면 이미지를 미리보여줍니다.