<input type="file" />
또는 API 요청과 같은 File 또는 Blob 객체를 편리하게 처리할 수 있는 방법을 제공하는 객체abort, load, error
와 같은 이벤트에서 발생한 프로세스를 처리하는데 주로 사용됨type이 file인 input 태그
<input type="file" />
에서 대용량 파일을 선택하고 파일 정보를 result 속성에 저장하는 과정이 동기식으로 동작한다면,
파일 정보를 result 속성에 저장할 때까지 HTML 렌더링에 영향을 줄 수 있음
👉🏻그렇기 때문에 FileReader는 비동기 방식으로 동작함
const reader = new FileReader();
파일의 내용은 result 속성에는 문자열 값으로 들어감
우리는 이 result 속성을 이용하여 아래의 4가지 방식으로 파일을 읽을 수 있음
const reader = new FileReader();
// 1. 텍스트
reader.readAsText(File 또는 Blob);
// 2. 데이터를 URL로 변환
reader.readAsDataURL(File 또는 Blob);
// 3. 배열 버퍼
reader.readAsArrayBuffer(File 또는 Blob);
// 4. 비트 문자열
reader.readAsBinaryString(File 또는 Blob);
위의 4가지 방식으로 File 또는 Blob로 읽을 수 있는데,
File 또는 Blob으로 읽은 결과를 처리하기 위한 과정도 함께 고려해야 함
주로 load, abort, error, progress
이벤트에서 FileReader 객체를 사용하여 결과를 확인하거나 처리함
//불러온 파일 임시저장할 state (초기값 : 빈상태)
const [attachment, setAttachment] = useState();
const onFileChange = (e) => {
const {
target: {files},
} = e;
const theFile = files[0]; //우선 1개만 보여줄꺼니까 크기 1로 지정
//FileReader 객체 생성
const reader = new FileReader();
//로드될 때 result 가져오기
reader.onloaded = (finishedEvent) => {
const {
currentTarget: {result},
} = finistedEvent;
//불러온 결과(이미지)를 attachment에 넣기
setAttachment(result);
}
//파일 데이터를 URL로 변환하기
reader.readAsDataURL(theFile);
}
return(
(생략)
//파일 선택할 input창 (image파일만 불러오기)
<input type="file" accept="image/*" onChange={ onFileChange } />
//파일이 존재할 때만 미리보기 보여주기
{ attachment && <img src={ attachment } width="50px" height="50px" /> }
)