개발/JavaScript
Blob 으로 img 태그 src 속성에 사용할 url 만들기(base64)
나태쿤
2024. 9. 2. 23:47
728x90
주로 이미지 태크에 src 속성에는 크게 3가지 방법으로 나타낼수 있다
1. 서버의 물리경로
2. api의 url
3. base64 방식 (api로 데이터 그자체를 가져온경우)
1번은 html, css로 퍼블리싱할때, 즉 하드 코딩할때
2번은 백엔드로부터 가져올때가되고
3번이 이 게시글의 목적이 되겠다
상황은 다음과 같다
프론트단 주로 js 확장자에서
브라우저에 내장된 fetch api를 이용하거나 (필자는 이방식을 좋아한다)
외부 라이브러리인 axios를 다운로드하여 api를 사용하거나
둘다 blob으로 리턴 받을 수 있는데 같이 사용하면 좋겠다.
api를 통해서 blob 형태로 가져왓다고 치자
이렇게 쓰면 될거다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | function fnApi() { console.log('api 호출') const file = new Blob() return file; } function fnMakeImgTag() { // api 로 blob 를 얻었다고 가정 const file = fnApi() const fileReader = new FileReader() // 이벤트 등록 fileReader.onload = e => { const base64EncodeText = e.target?.result const html = `<img src="${base64EncodeText}" alt="" />` document.getElementById('targetId').innerHTML = html } fileReader.readAsDataURL(file) } | cs |
파일(blob)을 base64 문자열로 인코딩하려면 시간이 소요되는데
그렇기 때문에 이벤트로 동작한다.
따라서 fileReader.readAsDataURL 을 호출하면
이벤트가 호출되고
그 내부 로직에서 원하고자하는 코드를 작성하면된다
나는 샘플코드로 img 태그를 만들어 특정 id 적었는데
자식요소로 추가할 수 도 있고 다양하게 사용해보자
다음은 ProgressEvent 의 스펙이다
다음은 FileReader 의 스펙이다
두개를 합치면 e.target.result 의 타입이 string 일수도 있다는걸 알 수 있다
728x90