예제 보기
코드 내용
<template>
<div>
<h3>파일 첨부</h3>
<input @change="handleImgUpload" type="file" accept="image/*" />
<h3>미리보기</h3>
<img id="preview" />
</div>
</template>
<script setup>
const handleImgUpload = (e) => {
var reader = new FileReader();
reader.readAsDataURL(e.target.files[0]);
reader.onload = (e) => {
/* 업로드한 파일 정보를 Base64를 이용해서 이미지로 보여주기 */
document.getElementById('preview').src = e.target.result;
};
};
</script>
코드 설명
핵심
FileReader 객체의 readAsDataURL() 라는 함수에 매개 변수로 파일 객체를 넘겨서
업로드된 파일 객체의 정보를 Base64로 재작성(인코딩)하고, 해당 정보를 이미지 태그 src 속성에 넣어주면 끝 !
FileReader
이름에서 유추할 수 있듯이 파일을 읽는 역할을 해서 FileReader라는 이름이 붙었다.
주로 업로드된 이미지 파일 미리보기용도로 간단하게 쓸 때 유용하다 👍
업로드하려는 이미지의 내용을 Base64 방식으로 재작성(인코딩)해서, src 속성에 넣으면 이미지가 나온다 !
FileReader 진행 단계에 대한 훅(Hook) 기능들
<script setup>
const handleImgUpload = (e) => {
var reader = new FileReader();
reader.readAsDataURL(e.target.files[0]);
reader.onloadstart = () => {
console.log("진행 시작");
};
reader.onprogress = () => {
console.log("진행중");
};
reader.onload = (e) => {
/* 업로드한 파일 정보를 Base64를 이용해서 이미지로 보여주기 */
console.log("업로드 성공했을때만 실행");
document.getElementById('preview').src = e.target.result;
};
reader.onloadend = ( ) => {
console.log("업로드 성공 여부와 관계없이 업로드 진행이 종료되었을때");
};
reader.onabort = ( ) => {
console.log("업로드 진행중 취소되었을때");
};
reader.onerror = ( ) => {
console.log("업로드 진행중 오류가 발생했을때");
};
};
</script>
onLoad 이벤트 내용을 이렇게 바꿀 수도 있다
// reader.onload = (e) => {
// /* 업로드한 파일 정보를 Base64를 이용해서 이미지로 보여주기 */
// console.log("업로드 성공했을때만 실행");
// document.getElementById('preview').src = e.target.result;
// };
reader.onload = ( ) => {
/* 매개변수를 안받고, reader 객체의 result 속성 값을 사용할 수도 있다. */
console.log("업로드 성공했을때만 실행");
document.getElementById('preview').src = reader.result;
};
참고 문서
https://developer.mozilla.org/ko/docs/Web/API/FileReader/readAsDataURL
FileReader.readAsDataURL() - Web API | MDN
readAsDataURL 메서드는 컨텐츠를 특정 Blob 이나 File에서 읽어 오는 역할을 합니다. 읽어오는 read 행위가 종료되는 경우에, readyState (en-US) 의 상태가 DONE이 되며, loadend (en-US) 이벤트가 트리거 됩니다.
developer.mozilla.org
'💻 FullStack > Vue.js' 카테고리의 다른 글
Vue Day.js 라이브러리로 진행률(%) 표시하기 (0) | 2024.01.14 |
---|---|
Vue 날짜 표시 라이브러리 Day.js (1) | 2024.01.14 |
Vue 시작일과 종료일로 진행률(%) 표시하기 (0) | 2023.09.19 |
Vue CSS height 속성 값에 % 사용해보기 (1) | 2023.09.14 |
Composition API 방식에서 refs를 쓰고싶다면 (0) | 2023.09.12 |