input[type="file"] 에서 업로드된 파일을 미리보기로 확인하고 싶을때
fileReader, createObjectURL 2가지 방법을 사용할 수 있다고 한다.
: 파일에 저장된 정보의 형태나 형식을
아래와 같은 이유들로 다른 형태로 변환하는 처리
: 인코딩의 역과정
: 텍스트 데이터가 아닌 이미지, 오디오 파일 등 바이너리 데이터(8비트 이진 데이터)
를
64개의 문자로 구성된 텍스트 데이터
로 변환
즉, 변수에 문자열이나 숫자를 저장하는 것처럼, 변수에 이미지를 저장할 수 있게 해준다.
input[type="file"] 엘리멘트에 업로드 된 파일들은 FileList 객체로 되어있고,
FileList안에는 File 객체가 들어있다.
: 이미지, 오디오, 비디오 같은 멀티미디어 파일 바이너리를 객체 형태
로 저장한 것
const myBlob = new Blob(array, options)
: 파일변환
이메일과 함께 동봉할 파일을 텍스트로 변환해서 전달하기 위해 개발되었으나,
현재는 웹을 통해서 여러 형태의 파일을 전달하는데 사용
: 클라이언트 측 파일(File, Blob 객체)을 비동기적으로 읽는데 사용되는 브라우저 API
const [previewImg, setPreviewImg] = useState('');
const handleUploadProfile = (event: React.ChangeEvent<HTMLInputElement>) => {
const file: File | undefined = event.target.files?.[0];
if (file) {
const reader = new FileReader(); // ---------> 0. 생성자
reader.onload = () => { // ---------> 2. 이벤트 핸들링
setPreviewImg(reader.result as string); // ---------> ⭐️ 3. 결과 접근
}
reader.readAsDataURL(file);// ---------> 1. 파일 읽기
}
}
fileReader의 생성자, 속성, 메서드, 이벤트 핸들러 더 자세히 설명된 글 참조
reader.result의 type은 string | ArrayBuffer | null 이기 때문에
useState로 관리하는 변수 type(string | null)에 담을때 오류가 생긴다.
그러므로! reader.result로 변경할때 as string으로 타입 단언해줘야 함.
ArrayBuffer : 고정된 크기의 메모리 공간에 바이너리 데이터를 저장하는 객체?
이벤트 핸들러는 읽기 동작 메서드가 완료되면 발생
이벤트 핸들러가 읽기 동작 메서드보다 먼자 적는게 더 좋다?
: 읽기 메서드(readAsDataURL 등)는 비동기적으로 작동하기 때문에
onload 이벤트 핸들러가 미리 등록되어 있어야
비동기 작업(즉, 읽기 메서드)이 빨리 끝나더라도 onload가 응답할 수 있게 하기 위해서다.
: File 객체나 Blob 객체를 URL로 변환하기 위해서
URL.createObjectURL(file객체 OR Blob 객체)
인코딩과 디코딩
리액트에서 이미지 미리보기 만들어보기 (React Image Preview)
[React] 이미지 업로드 미리보기(FileReader / createObjectURL)
Blob객체란?
[typescript] input type="file" image, preview, 미리보기(nextJs, React)
⭐️ JS-📚-Base64-Blob-ArrayBuffer-File-다루기-정말-이해하기-쉽게-설명
MIME가 뭐지?
createObjectURL을 사용해서 이미지 업로드 후 미리보기
[React/JavaScript] 이미지 파일 업로드 전 미리 보는 방법