๐ Base64 / Blob / ArrayBuffer / File ๋ค๋ฃจ๊ธฐ ์ด์ ๋ฆฌ
์น ๊ฐ๋ฐ์ ์งํํ๋ค ๋ณด๋ฉด ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ์ด์ผ ํ ๋๋ฅผ ๊ฐํน ๋ง์ฃผ์น ์ ์๋ค. ๋ธ๋ผ์ฐ์ ์์ ์ฃผ๋ก ํ์ผ ์์ฑ, ์ ๋ก๋, ๋ค์ด๋ก๋ ๋๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ๊ด๋ จ์ด ๊น๊ณ , ์๋ฒ ์ฌ์ด๋์ธ node.js ์์ ํ์ผ ๋ถํฐ ๋ฒํผ ๊น์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ํฉ์ด ์์ ์ ์๋ค.
์ฐ๋ฆฌ๊ฐ ํ์์ ํ๋ก๊ทธ๋๋ฐ ํ๋ฉด์ ์ง์ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ์ผ์ ๋ณ๋ก ์๋ค. ๊ณ ๊ธ ์ธ์ด๋ฅผ ์ฌ์ฉํด ํ๋ก๊ทธ๋๋ฐ ํ๊ธฐ ๋๋ฌธ์ ์ฌ๋์ด ์ฝ์์์๋ ์์ฐ์ด๋ก ์ฝ๋ฉํด๋๋ฉด, ๋ด๋ถ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ด ์์์ ์ด์ง ๋ฐ์ดํฐ๋ก ๋ณํํ์ฌ ์ฝ๊ณ ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง ์ ์, ์ค์, ๋ฌธ์๊ฐ ์๋ ํ์ผ์ด๋ ์ด๋ฏธ์ง, ๋น๋์ค ๊ฐ์ ๋ฉํฐ๋ฏธ๋์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ์ด์ผ ํ ๋๋ ๋๊ฐํด์ง๋ค.
์ด ๋ฉํฐ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ ์, ๋ฌธ์ ๋ค๋ฃจ๋ฏ์ด ํด์ผ๋๋๋ฐ ์ด์ง ๋ฐ์ดํฐ๋ฅผ 0๊ณผ 1๋ก ๋ค๋ฃฐ์์๋ ๊ฒ๋ ์๋๊ณ ์ด๋ป๊ฒ ํ ๊น
์ด๋ฒ ํฌ์คํ ์์๋ ํ๋ฒ์ฏค IT์ ๊ณ์ ์ข ์ฌํด๋ดค์ผ๋ฉด ๋ค์ด๋ณธ binary, base64, blob, arraybuffer, buffer, file ํ์ ์ ๋ํด์ ๊ฐ๋ ์ ์์๋ณด๊ณ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ง์ํ๋ ๋ด์ฅ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ์ด๋ฏธ์ง ๋ฉํฐ๋ฏธ๋์ด ํ์ผ์ ์ด๋ค ๋ฌธ๋ฒ์ ์ด๋ค์ ๋ณํํ๊ณ ์ด์ฉํ ์ ์๋์ง ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ ๊ฒ์ด๋ค.
Binary
์ฌ๋ฌ๋ถ๋ ์์๋ค์ถ์ด, ์ปดํจํฐ๋ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ 0๊ณผ 1๋ก ์ ์ฅํ๋ค.
Binary(๋ฐ์ด๋๋ฆฌ)๋ ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์๋ฏธํ๋ฉฐ, '1'๊ณผ '0'๋ง์ ์ฌ์ฉํ์ฌ 2๊ฐ์ ์๋ฅผ ๋ํ๋ด๋ ์ง๋ฒ์ ๋ปํ๋, ์ปดํจํฐ(ํ๋ก๊ทธ๋๋ฐ)์ ๋ค๋ฃจ๋๋ฐ ์์ด ๊ฐ์ฅ ๊ทผ๋ณธ์ด ๋๋ ์ฒด๊ณ๋ผ๊ณ ๋ณผ์ ์๋ค.
Base64
์ปดํจํฐ๋ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ 0๊ณผ 1๋ก ์ ์ฅํ๋ค๊ณ ๋งํ๋ค. ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ๋ณด๊ณ ์๋ ๋ธ๋ผ์ฐ์ ์ญ์ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ ธ ์๋ ๊ฒ์ด๋ฉฐ ํด๋๋ ํ์ผ ์ญ์ ์ด์ง ๋ฐ์ดํฐ๋ก ์ด๋ฃจ์ด์ง ๊ฒ์ด๋ค.
๊ทธ๋ผ ์ปดํจํฐ ์์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ด ์ฐ๊ณ ์ถ์๋ ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์ฐ๋ฆฌ๊ฐ ํ๋ก๊ทธ๋๋ฐ์์ ๋ฐฐ์ฐ๋ ๋ณ์ ๊ฐ๋ ์ด ๋ฐ๋ก ์ด ๊ฐ๋ ์ด๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ณ์์ ์ ์ฌํด๋๊ณ , ํ์ํ๋ฉด ์ฐ๋ฆฌ๋ ๋ณ์๋ฅผ ๋ถ๋ฌ ๋ง์ , ๋บ์ ์ ํ๋ ๊ฒ์ผ๋ก ์ปดํจํฐ ์์ ์ด์ง ๋ฐ์ดํฐ(๋ฐ์ด๋๋ฆฌ)๋ฅผ ๋ค๋ฃจ๊ณ ์์๋ ๊ฒ์ด๋ค.
์ซ์๋ ์คํธ๋ง์ด ์๋, ์ด๋ฏธ์ง๋ ๋น๋์ค ๊ฐ์ ๋ณต์กํ ๋ฉํฐ๋ฏธ๋์ด ํ์ผ๋ค์ ์ด๋ป๊ฒ ๋ณ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ ๊น?
๋ณ์์ ์ด๋ฏธ์ง url์ ์ ์ฅํ๋๊ฑด ๋งํฌ๋ผ๋ ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ์ ์ฅํ๋๊ฑฐ์ง ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๊ทธ ์์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ค.
์ด๋ ๋ฑ์ฅํ๋ ๊ฒ์ด Base64 ๋ผ๋ ๊ฐ๋ ์ด๋ค. Base64๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ์ด์ง ๋ฐ์ดํฐ(๋ฐ์ด๋๋ฆฌ)๋ฅผ ์ธ์ฝ๋ฉํ์ฌ ํ ์คํธ ํ์์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๋งํ๋ค.
์๋ฅผ๋ค์ด ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ์ค์ html์ img์ src์ ์ด๋ฏธ์ง url์ด ์๋ ์ซ์์ ๋ฌธ์๋ก ๊ตฌ์ฑ๋ ๊ธด ์ฝ๋(data:image/png;base64)๊ฐ ๋ค์ด๊ฐ ๊ฒฝ์ฐ๋ฅผ ๋ณธ์ ์ด ์์ ํ ๋ฐ ์ด๊ฒ์ด ๋ฐ๋ก base64 ์ด๋ค. 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ง ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์์ฒด๋ฅผ base64 ํ ์คํธ ๊ธฐ๋ฐ ํฌ๋งท์ผ๋ก ๋ณํํด์ค์ผ๋ก์ ์ฐ๋ฆฌ๊ฐ ์ง์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ์ ์๋ ๊ฒ์ด๋ค.
์ฝ๊ฒ ์ดํดํด ๋ณด์๋ฉด, ๋ง์ผ ์ฐ๋ฆฌ๊ฐ ์์ค ์ฝ๋๋จ์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ ๋ค๋ฃจ์ด์ผ ํ๋ค๊ณ ํ์.
๋ณดํต์ด๋ผ๋ฉด, ๋งํฌ๋ฅผ ํตํด ๋ถ๋ฌ์ค๊ฑฐ๋ ํน์ ๋ก์ปฌ ํด๋์ ์ ์ฅ๋์ด์๋ ์ด๋ฏธ์ง ํ์ผ์, ์ฝ๋์์ ์ ๊ณตํ๋ ํ์ผ์์คํ ์ ํตํด ์๋๊ฒฝ๋ก๋ก ๋ถ๋ฌ์ ๋ค๋ค๋ณธ ๊ฒฝํ์ด ์์ ๊ฒ์ด๋ค. ํ์ง๋ง ํ์ผ๋ ๊ฒฐ๊ตญ url๊ณผ ๊ฐ์ด OS์ ์ ์ฅ๋ ์ง๊ฒ๋ค๋ฆฌ๋ฅผ ๋ถ๋ฌ์จ ๊ฒ ๊ณผ ๋ค๋ฆ์ด ์๋ค.
๊ทธ๋ฌ๋ base64๋ก ๋ณํํด์ฃผ๋ฉด ์ฐ๋ฆฌ๊ฐ ์ง์ ์์ค ์ฝ๋๋จ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์์ฒด๋ฅผ ์ ์ฅํ ์ ์๊ฒ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ณ์์ ๋ฌธ์์ด์ด๋ ์ซ์๋ฅผ ์ ์ฅํ๋ ๊ฒ ์ฒ๋ผ, ๋ณ์์ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ ์ ์๋ ๊ฒ์ด๋ค.
base64๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ๊ฐ์ ๋ณํํ๋๊ฒ ์๋ ๊ทธ๋ฅ ์ถ๋ ฅ ํ์์ ๋ณํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง ์์ฒด๊ฐ ๋ฐ๋๋ ๊ฒ์ด ์๋๋ ๊ฐ๋ฅํ ๊ฒ์ด๋ค. ์ฆ, ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์ ๋ณด๋ ์ด๋ฏธ base64 ํ ์คํธ ์์ฒด์ ํฌํจ๋์ด ์๊ธฐ๋๋ฌธ์, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋งํฌ url์ ํตํด ์๋ฒ์ ์์ฒญํ์ง ์๊ณ ๋ ์ง์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค. (์์ค ์ฝ๋ ๋จ์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ํํ ์ด๋๊น!)
๋ณดํต ์์ ๊ฐ์ด html์์ ์ง์ base64 ์ด๋ฏธ์ง ํฌ๋งท์ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ํฌ๊ธฐ๊ฐ ์์ ์ด๋ฏธ์ง๋ฅผ url์ด๋ ํ์ผ ๋ถ๋ฌ์ค๋ ๊ฒ ์์ด html์ ์ง์ ์ฝ์ ํ๋ ๊ฒฝ์ฐ
- ๊ฐ๋จํ ํ์ด์ง๋ฅผ ์์ฑํด ์์๋ก ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
- ์ด๋ฏธ์ง๊ฐ ๋ค์ด๊ฐ ๋ฉ์ผ ๋ด์ฉ์ html์ผ๋ก ์์ฑํด์ ๋ณด๋ด๋ ๊ฒฝ์ฐ
์ด๋ ๊ฒ base64๋ก ๋ณํํ๋ฉด ์ง์ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ค๋ฃฌ๋ค๋ ํน์ง๋ ์์ง๋ง, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ๋ก ๋ฐ๊พธ๋ 64์ง๋ฒ ์ธ์ฝ๋ฉ์ ํตํด, ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ๋๋น 33%์ ๋ฐ์ดํฐ์ ์ ์ฆ๊ฐํ๊ฒ ๋๋ค๋ ๋จ์ ์ด ์๋ค. ํ์ง๋ง ๋ฐ์ดํฐ์ ๊ธธ์ด๊ฐ ์ฆ๊ฐํจ์๋, Base64๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ์์ ์๊ฐํ๋ฏ์ด Binary ๋ฐ์ดํฐ๋ฅผ ํ ์คํธ ๊ธฐ๋ฐ ๊ท๊ฒฉ์ผ๋ก ๋ค๋ฃฐ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ์์ ๋ฐ์ด๋๋ฆฌ ํ์์ผ๋ก ๋จ์์๋๋ณด๋ค ์ ์ก/์ ์ฅ์ด ํจ์ฌ ์ฝ๋ค๋ ์ ๋ ๊ผฝ์ ์ ์๋ค. (์ด์ง ๋ฐ์ดํฐ๋ ์์๋ ํ๋ฅ ์ด ๋๋ค)
์ธ์ฝ๋ฉ ํ ์, ๋ฌธ์ ํฌ๋งท์ A-Z,a-z,0–9,/+ ๋ง์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ๋ฌธ์ ํฌ๋งท์ด ๋ฌ๋ผ ๋ฐ์ดํฐ๋ฅผ ์์์ํฌ ์์๋ ์์คํ ๊ฐ์๋ ์์ ์ ์ผ๋ก ์ ์ก ๋ ์ ์๋ค.
์ง๊ธ๊น์ง์ base64 ํฌ๋งท์ ๋ํด ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ณ๋ ์ด๋ฏธ์ง ํ์ผ์ด ํ์์๋ค. ์๋ํ๋ฉด base64 ๋ฐ์ดํฐ ์์ฒด๊ฐ ์ด๋ฏธ์ง์ด๊ธฐ ๋๋ฌธ.
- ๋ธ๋ผ์ฐ์ ๋ ๋๋ง์, ๋ฌธ์๋ก๋ฉ๊ณผ ๊ฐ์ด ๋ก๋ฉ ๋๊ธฐ์ ๋๊ธฐ์ง ์๊ณ ๋ถ๋ฌ์จ๋ค. ๋ํ ๋คํธ์ํฌ๊ฐ ์ข์ง์์๋ ์์ ๊ฐ์ ํน์ง์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ๋ก๋ฉํ ์ ์๋ค๋ ์ ๋ ์๋ค.
- ๋ฌธ์์ด์ด ๋งค์ฐ๋งค์ฐ ๊ธธ๊ธฐ์ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋ค.
- Base64 ์ธ์ฝ๋ฉ์ ์ฌ์ฉํ๋ฉด ์๋ณธ๋ณด๋ค 33%์ ์ฉ๋์ด ์ปค์ ธ์, ๋จ์ฉํ ๊ฒฝ์ฐ ์คํ๋ ค ๋ก๋ฉ ์๋๊ฐ ์ ํ๋ ์ ์๋ค.
์ด๋ฏธ์ง URL์ base64๋ก ๋ณํํ๊ธฐ
base64 ๊ฐ๋ ์ด๋ก ์ ๋ํด ์์์ผ๋ ์ด์ ์ง์ ์ค์ ๋ก ๋ค๋ค๋ณด์.
์ธ์ฝ๋ฉ ์ฌ์ดํธ ์ด์ฉ
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ์๋์ ์จ๋ผ์ธ ์ฌ์ดํธ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด๋ค. ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ ํ๋ฉด ๋ณ๋ค๋ฅธ ์์ ์์ด ๋ค์๊ณผ ๊ฐ์ด base64 ๋ก ๋ณํํด์ค๋ค.
ํ๋ก๊ทธ๋๋ฐ
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ด์ฉํด ๋ณํํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋จผ์ fetch api๋ก ์ด๋ฏธ์ง๋ฅผ ์ฝ์ด๋ค์ด๊ณ , ์ด๋ฏธ์ง๋ฅผ blob ํ์์ผ๋ก ๋ณํํ๋ค. ๊ทธ๋ฆฌ๊ณ FileReader ๊ฐ์ฒด๋ฅผ ํตํด blob ๋ฐ์ดํฐ๋ฅผ base64 ํ์์ผ๋ก ์ฝ์ด๋ค์ด ๋ณํ์ํจ๋ค. (blob์ ๋ฐ๋ก ๋ค์์ ๋ฐฐ์ด๋ค)
FileReader๋ Blob ๋๋ File๊ณผ ๊ฐ์ ์๋ฃํ ๊ฐ์ฒด๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์ด๊ธฐ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค.
์ฝ์ด๋ค์ธ ๋ฐ์ดํฐ๋ ์ฃผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ํ์ด๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค. (๋ฐ์์ ์์ธํ ๋ฐฐ์ด๋ค)
(async () => {
const data = await fetch('https://play-lh.googleusercontent.com/hYdIazwJBlPhmN74Yz3m_jU9nA6t02U7ZARfKunt6dauUAB6O3nLHp0v5ypisNt9OJk');
const blob = await data.blob();
const reader = new FileReader();
reader.onload = () => {
const base64data = reader.result;
console.log(base64data)
}
reader.readAsDataURL(blob);
})()
์ค์ ๋ก ์ถ๋ ฅ๋ base64 ๋ฐ์ดํฐ๊ฐ์ ๋ธ๋ผ์ฐ์ ์ ์ณ๋ณด๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ์ด๋ฏธ์ง๊ฐ ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค.
Blob (Binary Large Object)
BLOB์ Binary Large OBject์ ์ฝ์๋ก ์ฃผ๋ก ์ด๋ฏธ์ง, ์ค๋์ค, ๋น๋์ค์ ๊ฐ์ ๋ฉํฐ๋ฏธ๋์ด ํ์ผ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ฐ์ฒด ํํ๋ก ์ ์ฅํ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฉํฐ๋ฏธ๋์ด ํ์ผ๋ค์ ๋๋ค์ ์ฉ๋์ด ํฐ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํจ๊ณผ์ ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํด ๊ณ ์๋ ์๋ฃํ์ด๋ผ ๋ณผ ์ ์๋ค. (string ํ์ , number ํ์ ์ด ์๋ฏ์ด blob ํ์ ์ด ์๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค)
์๋ฅผ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ด๋ฏธ์ง ํ์ผ์ ๊ทธ๋๋ก ๋ฐ์ดํฐ๋ก ์ ์ฅํ๊ณ ์ถ์๋, ๋ฐ๋ก blob ํฌ๋งท์ผ๋ก ๋ณํํ ๋ค ์ ์ฅํ๋ ๊ฒ์ด๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ์ด๋ฌํ blob ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ ์ฌ์ฉํ ์ ์๋ค. ์ฃผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ ์คํธ, ์ด๋ฏธ์ง, ์ฌ์ด๋, ๋น๋์ค์ ๊ฐ์ ๋ฉํฐ๋ฏธ๋์ด ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฌ์ฉํ๋ค.
์ข๋ ์ดํดํ๊ธฐ ์ฝ๊ฒ, base64์ ์ด๋ค์ ์ด ๋ค๋ฅธ์ง ๋น๊ตํด๋ณด์.
- base64๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ํ ์คํธ(๋ฌธ์์ด) ํํ๋ก ์ ์ฅํ ํฌ๋งท์ด๋ผ๊ณ ํ์๋ค.
- blob์ด๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด ๊ฐ์ฒด(Object) ์ ์ฅํ๋ ๊ฒ์ด๋ค.
์์ base64 ํฌ๋งท์ผ๋ก ์ด๋ฏธ์ง ๋ฐ์ด๋๋ฆฌ ํ์ผ์ ๋ธ๋ผ์ฐ์ ์์ ํํํ๋ ค๋ฉด, FileReader ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ณํํ <img> ํ๊ทธ์ src ์์ฑ์ ๋ฃ์ผ๋ฉด ๊ฐ๋ฅํ์๋ค. ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ด ๋ฌธ์์ด์ด ๊ต์ฅํ ๊ธธ์ด์ ธ ๊ฐ๋ ์ฑ์ด ์์ข์ ๋ฟ๋ง ์๋๋ผ, base64 ์ด๋ฏธ์ง๋ฅผ ์ด๊ณณ์ ๊ณณ ์ฌ๋ฌ๊ฐ ์ฌ์ฉํ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ฉ๋ ๋ฌธ์ ๋๋ฌธ์(33% ์ปค์ง๋ค) ๋ฌธ์ ์์ฒด๋ฅผ ๋ก๋ฉํ๋๋ฐ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ ค ์คํ๋ ค ๋๋ ค์ง์ ์๋ค๋ ๋จ์ ์ ์ง๋๊ณ ์๋ค.
ํ์ง๋ง blob ๋ฐ์ดํฐ๋ ์ ์ ํ๊ฒ object url๋ก ๋ณํ๋ง ํด์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฌํํ๊ฒ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ blob์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์ฝ๋ ํ์ฉ์ฑ์ ์ง๋๊ณ ์์ด, base64๋ก ๋ณํํ ์๋ ์๊ณ ๋ค์์ ๋ฐฐ์ธ buffer๋ก๋ ๋ณํํ ์๋ ์๋ค.
blob ์ด๋ฏธ์ง ๋ค๋ฃจ๊ธฐ
๋ณธ๊ฒฉ์ ์ผ๋ก ์ด๋ฏธ์ง ํ์ผ์ blob์ผ๋ก ๋ณํํด ๋ค๋ค๋ณด๋ ์ค์ต์ ๊ฐ์ ธ๋ณด์. ๋ค์์ ์ด๋ฏธ์ง๋ฅผ fetch api๋ก ๋ฐ์์ blob ํฌ๋งท์ผ๋ก ๋ณํํ๋ ์ฝ๋์ด๋ค.
const data = await fetch('https://play-lh.googleusercontent.com/hYdIazwJBlPhmN74Yz3m_jU9nA6t02U7ZARfKunt6dauUAB6O3nLHp0v5ypisNt9OJk');
const blob = await data.blob(); // ์ด๋ฏธ์ง blob ๊ฐ์ฒด ์ป๊ธฐ
Blob → ObjectURL ๋ณํ
์ด๋ ๊ฒ ๋ง๋ค์ด์ง Blob ๊ฐ์ฒด๋ ๊ณง๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด ์๋๊ณ , <a>, <img> ํ๊ทธ์ src ์์ฑ์ ์ฌ์ฉํ ์ ์๋ url ํ์ ์ผ๋ก ๋ฐ๋ก ๋ณํ์ ํด์ผํ๋ค.
<img src="" alt="" style="width:150px; display: block;">
<a download="img.jpg" href="#">์ด๋ฏธ์ง ๋ค์ด๋ก๋</a>
<script>
fetch('https://www.business2community.com/wp-content/uploads/2014/04/Free.jpg')
.then((response) => response.blob())
.then((blob) => {
const url = URL.createObjectURL(blob);
document.querySelector('img').src = url;
document.querySelector('a').href = url;
});
</script>
See the Pen blob image by barzz12 (@inpaSkyrim) on CodePen.
URL.createObjectURL ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด Blob ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ณ ๊ณ ์ ํ URL์ ์์ฑํ ์ ์๋ค. ์ด๋ ์์ฑ๋๋ URL์ ํํ๋ blob:/์ ํํ๋ฅผ ๋๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ณํ๋ URL์ source(src)๋ฅผ ์์ฑ์ผ๋ก ๊ฐ์ง๋ ๋ชจ๋ HTML ํ๊ทธ์ CSS ์์ฑ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Blob ๊ฐ์ฒด์๋ ๋ณ๋๋ก type(image/png) ์ ๋ช ์ํ๊ธฐ ๋๋ฌธ์ Blob ๊ฐ์ฒด๋ฅผ ๋ค์ด๋ก๋/์ ๋ก๋ ํ๋ ๊ณผ์ ์์ ๋คํธ์ํฌ ์์ฒญ์์์ Content-Type์ ์์ฐ์ค๋ ๋ช ์๋ type์ผ๋ก ๋งค์นญ๋๋ค.
์ด๋ ๋ณํ๋ URL์ ํ์ฌ ํญ์ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ณ , ์ ์ฅ๋ URL์ ๋งคํ๋ Blob ๊ฐ์ฒด๋ฅผ ์ฐธ๊ณ ํ๊ณ ์๋ ํํ์ด๋ค. ์ด๋ฌํ ์๋ฆฌ ๋๋ฌธ์, base64์๋ ๋ฌ๋ฆฌ ์งง์ ๋ฌธ์์ด๋ง์ผ๋ก๋ ์๋์ Blob ๊ฐ์ฒด์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ณ ๊ทธ์ ๋ฐ๋ฅธ ์ด๋ฏธ์ง ๋ฑ์ ํ์ผ์ ๊ฐ์ ธ์ฌ ์ ์๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ๋ณํ๋ URL์ ํญ์ ํ์ฌ ๋ฌธ์์์๋ง ์ ํจํ๋ค. (ํ์ฌ ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฌ๋ ์ํ๋๊น)
๋ณํ๋ URL์ ํ์ฌ ๋ฌธ์๋ฅผ ์๋ก๊ณ ์นจํ๊ฑฐ๋ ์๋๋ฉด ๋ค๋ฅธ ํ์ด์ง์์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ค๋ฉด ์ ๋๋ก ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฌ๋ ์ด์ ๊ด๋ จํ ๋ฉ๋ชจ๋ฆฌ ์ด์๊ฐ ์กฐ์ฌํ๋ค.
Blob ๊ฐ์ฒด๊ฐ URL๋ก ๋ณํ๋์ด ๋งคํ์ด ์ด๋ฃจ์ด์ง ์ฑ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ฒ ๋๋ฉด, ๋ช ์์ ์ผ๋ก ํด๋น URL์ด ํด์ ๋๊ธฐ ์ ๊น์ง ๋ธ๋ผ์ฐ์ ๋ ํด๋น URL์ด ์ ํจํ๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ด ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
๋ฐ๋ผ์ blob URL์ ์ฌ์ฉํ ์ดํ, ๋ ์ด์ ์ฌ์ฉํ์ง ์์ ์์ ์ด๋ผ๊ณ ํ๋จ๋๋ฉด ๋ช ์์ ์ผ๋ก ํด์ ํด ์ฃผ๋ ๊ฒ์ด ์ข๋ค.
// Create Blob URL
const objectURL = window.URL.createObjectURL(blob);
// Revoke Blob URL after DOM updates..
window.URL.revokeObjectURL(objectURL);
๋ณํ์ URL.createObjectURL ๋ฉ์๋๋ฅผ ํตํด ์งํํ๊ณ , ํด์ ์ ๊ฒฝ์ฐ์๋ URL.revokeObjectURL ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ ๋ด๋ถ์ ์ผ๋ก ๋งคํ๋์ด ์๋ ์ฐธ์กฐ๋ฅผ ์ง์ฐ๋ ๋ฉ์๋๋ก, ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผํ๊ณ ์๋ Blob ๊ฐ์ฒด๋ฅผ ์ง์ธ ์ ์๋ค.
์๋ฅผ ๋ค์ด ์ด๋ฏธ์ง๋ฅผ ํ๋ฉด์ ์ถ๋ ฅ์ด ์๋ ์ค๋ก์ง ์ด๋ฏธ์ง ๋ค์ด์ผ๋ก blob์ ์ฌ์ฉํ๋ค๊ณ ํ๋ฉด, ๋์ ์ผ๋ก ์์ฑํ Blob ๊ฐ์ฒด๋ ์ค์ง ๋ค์ด๋ก๋ ํด๋ฆญ ์๊ฐ์๋ง ํ์ํ๊ณ ๊ทธ ์ดํ์ ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ํด์ ๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
Blob → Base64 ๋ณํ
์์ ๋งํ๋ฏ์ด Blob ๊ฐ์ฒด๋ก base64์ ํํ๋ก ๋ณํ์ด ๊ฐ๋ฅํ๊ณ , ๋ณํ๋ ๋ฌธ์์ด์ ๋ฐ๋ก src ๋ก์จ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌํ URL์ ๋ณดํต data url ์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ด๋ ๊ฒ ๋ณํ๋ base64 ํํ์ URL์ ์์์ URL.createObjectURL ๋ฉ์๋๋ฅผ ํตํด ๋ณํํ ํํ์๋ ๋ฌ๋ฆฌ ์ด๋์์๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. (๋ฌธ์์ด ์์ฒด๊ฐ ์ด๋ฏธ์ง ๋ฐ์ดํฐ ์ด๊ธฐ ๋๋ฌธ์)
Blob ๊ฐ์ฒด๋ฅผ base64๋ก ์ธ์ฝ๋ฉ ํ์ฌ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ base64 ์๊ฐ ํํธ์์ ๋ค๋ค์๋ค.
fetch('https://play-lh.googleusercontent.com/hYdIazwJBlPhmN74Yz3m_jU9nA6t02U7ZARfKunt6dauUAB6O3nLHp0v5ypisNt9OJk')
.then((res) => res.blob())
.then((blob) => {
const reader = new FileReader();
reader.onload = () => {
const base64data = reader.result;
console.log(base64data)
}
reader.readAsDataURL(blob);
})
Blob ๊ฐ์ฒด๋ฅผ URL๋ก ๋ณํํ๋ ๋ ๊ฐ์ง ๋ฐฉ์ ๋ชจ๋ ํ์ฉ๋๊ฐ ๋๋ค. ํ์ง๋ง base64๋ก ์ธ์ฝ๋ฉ ํ๋ ๊ฒฝ์ฐ์ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๋งค์ฐ ๊ธธ์ด์ง ์ ์๋ค๋ ์ ๊ณผURL.craeteObjectURL๋ฉ์๋๋ณด๋ค ๋ ๋๋ฆฌ๋ค๋ ์ ์ด ์๋ ๋ฐ๋ฉด, ๋ณํ๋ data url์ ํ์ฌ ํญ์ ๋ฌธ์๋ฟ๋ง ์๋๋ผ ์ด๋์์๋ ์ ํจํ๋ค๋ ์ฅ์ ์ด ์๋ค.
ArrayBuffer
ArrayBuffer ๊ฐ์ฒด๋ ์ด๋ฏธ์ง, ๋์์๊ณผ ๊ฐ์ ๋ฉํฐ๋ฏธ๋์ด ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ํ์ค ์๋ฐ์คํฌ๋ฆฝํธ(๋ธ๋ผ์ฐ์ )์์ ๋ค๋ฃจ๊ธฐ ์ํด ๋์ ๋ฌ๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ค์๊ฐ ๋ฐฉ์ก๊ณผ ๊ฐ์ด ์์๋ด์ฉ์ ์ก์ถํ ๋์๋, ์์์ด๋ผ๊ณ ํ๋ ์ค์๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณ์ํด์ ์ ๋ฌํด์ค์ผ ์ ์ ๋ค์ด ์ด๊ฒ์ ๋ณผ ์ ์๋ค. ์ฆ, ์ด๋ค ์์ผ๋ก๋ ์ปค๋ค๋ ๋ฐ์ดํฐ๋ฅผ ์๊ฐ ์ชผ๊ฐ์ ์ ์กํด์ผ ํ๋ ์ํฉ์ด ๋ฐ์ํ๋ค๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ๋ฒํผ(buffer) ๋ผ๋ ๊ฐ๋ ์ด ๋ฑ์ฅ ํ๋๋ฐ, ์ผ์ ๊ตฌํ๋งํผ์ ๋ฐ์ดํฐ๋ฅผ ์ชผ๊ฐ์ ์ ๋ฌ๋๋ stream์ ์ ์ฅํ ํ ์ผ์ ํฌ๊ธฐ๊ฐ ๋๋ฌํ๋ฉด ์ถ๋ ฅ์ฅ์น๋ ๋์์ ํ๋ ์ด์ด๋ก ์ ๋ฌํด์ฃผ๋ ์ค๊ฐ์ ์ญํ ์ ํ๋ ๊ฐ์ฒด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค. (๋ฒํผ๋ง์ด ๋ฐ๋ก ์ด ๊ฐ๋ ์ด๋ค)
๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฉ๋๊ฐ ๋ค์ํด์ง๋ฉด์ ์ด์ฒ๋ผ ์ค๋์ค๋ ๋น๋์ค์ ๊ฐ์ binary data๋ค ์ญ์ ๋ค๋ฃฐ ํ์์ฑ์ด ์๊ธฐ๊ฒ ๋์, ํ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ ํ๊ฒ ํ ๋นํด์ ์ฌ์ฉํ ์ ์๋ ์ ์ฐ์ฑ์ด ํ์ํด ArrayBuffer๋ฅผ ๋ง๋ค๊ฒ ๋์๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
ArrayBuffer๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์์ ๋ฐ์ดํฐ(๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ)๋ฅผ ์ง์ ๋ค๋ฃจ๋ ์๋จ์ผ๋ก ์ฌ์ฉ๋๋ฉฐ, ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์๋์ผ๋ก ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋ค. ์ง๊ธ๊น์ง ๋ฐฐ์ด base64์ blob์ ์ฌ๋์ด ์ฝ๊ณ ๋ค๋ฃจ๊ธฐ ํธํ๊ฒ ๊ฐ๊ณต๋ ๋ฐ์ดํฐ ํ์ ์ด๋ผ๋ฉด, ArrayBuffer ๋ณด๋ค ์ค๋ฆฌ์ง๋์ ๊ฐ๊น๋ค๊ณ ๋ณด๋ฉด ๋๋ค. ๋ ํผ๋ฐ์ค ํ์ ์ผ๋ก ๋์ด์๊ณ , ๊ณ ์ ๋ ๊ธธ์ด์ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํด ์ฌ์ฉํ๊ฒ ๋ค๊ณ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค. (์ฐธ๊ณ ๋ก, ์ค๋์ค ์ ์ฉ์ธ AuidoBuffer, ๋ฏธ๋์ด ์ ์ฉ์ธ SourceBuffer๋ ์๋ค๊ณ ํ๋ค)
ํนํ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ ์ด์๋ฅผ ๋ค๋ฃฌ๋ค๊ฑฐ๋, ์๋๋ฉด Blob ๋ฑ์ ํฐ ์ฉ๋์ ํ์ผ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๊ฒฝ์ฐ์ ArrayBuffer๋ฅผ ์ฌ์ฉํด ์ ์ฐํ๊ณ ํจ์จ์ ์ผ๋ก ์์ ํ ์ ์๋ค.
ArrayBuffer๋ ์ฐ์๋ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋๋ ๊ณ ์ ๊ธธ์ด์ ๋ํ ์ฐธ์กฐ ๊ฐ์ฒด์ด๋ค. ํด๋น ๊ฐ์ฒด๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์๋ค.
let buffer = new ArrayBuffer(16); // 16 ๋ฐ์ดํธ ํฌ๊ธฐ์ buffer๋ฅผ ์์ฑ
buffer.byteLength; // 16
์ด๋ ์์ฑ๋ buffer ๊ฐ์ฒด๋ ์ฐ์๋ 16 ๋ฐ์ดํธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์์ผ๋ฉฐ, ์ด๊ธฐ๊ฐ์ ๋ชจ๋ 0์ผ๋ก ์ฑ์์ ธ ์๋ค.
์ฐธ๊ณ ๋ก, ์ด๋ฆ์ array๊ฐ ์๋ค๊ณ ํ์ฌ ArrayBuffer๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฐ์ด์ด๋ผ๊ณ ์ฐฉ๊ฐํ๋ฉด ์๋๋ค.
ArrayBuffer๋ ๊ทธ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์๋ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์๋ ์ถ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต๊ณผ๋ ๊ฐ๋ค.
ArrayBuffer๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฐฐ์ด๊ณผ ๋น๊ตํด ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ์ด ์๋ค.
- ๊ณ ์ ๊ธธ์ด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์ด๋ฅผ ๋์ด๊ฑฐ๋ ์ค์ผ ์ ์๋ค.
- ์ ํํ ๋ช ์๋ ํฌ๊ธฐ๋งํผ์ ๊ณต๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐจ์งํ๋ค.
- ๊ฐ๊ฐ์ ๋ฐ์ดํธ์ ์ ๊ทผํ๊ธฐ ์ํด์๋, ์ผ๋ฐ ๋ฐฐ์ด์ฒ๋ผ buffer[index]์ ๊ฐ์ด ์ธ๋ฑ์ค๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋ค. ๋์ ์ view๋ผ๊ณ ๋ถ๋ฆฌ๋ ๋ณ๋์ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ ๊ทผํด์ผ ํ๋ค.
์ผ๋ฐ์ ์ผ๋ก Array ๊ฐ์๊ฒฝ์ฐ ๊ทธ๋ฅ ๊ณง๋ฐ๋ก ์ ๊ทผํด์ ๋ฐฐ์ด ์์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์ ์์ง๋ง, ArrayBuffer์ ๋ํ ์ ๊ทผ ๋ฐ ์กฐ์์ ํญ์ view๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์์ฑํด์ ์ํํด์ผ ํ๋ค.
view ๊ฐ์ฒด๋ ์๊ธฐ ์ค์ค๋ก๋ ์ด๋ ํ ๋ฐ์ดํฐ๋ ์ ์ฅํ๊ณ ์์ง ์๊ณ , ๊ทธ์ ArrayBuffer์ ๋ด๋ถ๋ฅผ ๋ค์ฌ๋ค๋ณด๊ธฐ ์ํ ์๋จ์ผ๋ก ์ฌ์ฉํ๋ค. (์ด๋ค์ ๋ณดํต TypedArray ๋ผ๋ ์ฉ์ด๋ก ํํํ๋ค)
๋ค์์ ArrayBuffer์ ์๋ ๊ฐ ๋ฐ์ดํธ๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ๋ค๋ฃจ๋ view ๊ฐ์ฒด ์ข ๋ฅ์ด๋ค.
- Uint8Array : ์ซ์ 8์ ๋นํธ๋ฅผ ์๋ฏธํ๊ณ 8๋นํธ = 1๋ฐ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ฐ์ดํธ๋ณ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค. 1๋ฐ์ดํธ ํฌ๊ธฐ์ด๊ธฐ ๋๋ฌธ์ 0 - 255 ๋ฒ์์ ์๋ฅผ ๋ค๋ฃฐ ์ ์๋ค. (Uint8์ ์๋ฏธ๋ Unsigned 8bit Int์๋ ๊ฐ๋ค)
- Uint16Array : 2๋ฐ์ดํธ(16๋นํธ) ๋จ์ ์ ์ํ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ view ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ๋ค๋ฃฐ ์ ์๋ ๋ฒ์๋ 0 - 65535์ ํด๋นํ๋ค.
- Uint32Array : 4๋ฐ์ดํธ(32๋นํธ) ๋จ์ ์ ์ํ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ view ๊ฐ์ฒด์ด๋ค. ๋ฐ๋ผ์ ๋ค๋ฃฐ ์ ์๋ ๋ฒ์๋ 0 - 4294967295์ ํด๋นํ๋ค.
- Float64Array : 8๋ฐ์ดํธ(64๋นํธ) ๋จ์๋ก ๋ถ๋ ์์์ ๋ฐฉ์์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ view ๊ฐ์ฒด์ด๋ค. ๋ค๋ฃฐ ์ ์๋ ๋ฒ์๋ 5.0x10^-324 ๋ถํฐ 1.8x10^308 ๊น์ง์ด๋ค.
let buffer = new ArrayBuffer(16);
let view = new Uint32Array(buffer);
// buffer์ [00000000 00000000 ...... (์ด 16๊ฐ)] ๋ก ํ์ฑ๋์ด์๊ณ
// view๊ฐ ์ด๊ฒ์ ์ธ์ํ ๋ 4๋ฐ์ดํธ์ฉ, ์ฆ 8๊ฐ์ง๋ฆฌ 4๊ฐ์ฉ ๋จ์๋ก ๋์ด ์ฝ๋๋ค๋ ์๋ฆฌ๋ค.
// [00000000 00000000 00000000 00000000, 00000000 00000000 ......]
console.log(view.length); // ๋ถํ ํด์ ์ฝ๋ ๊ณต๊ฐ์ ๊ฐฏ์๊ฐ ์ด 4๊ฐ (16๋ฐ์ดํธ / 4๋ฐ์ดํธ)
console.log(view.byteLength); // ์ด ๋ฐ์ดํธํฌ๊ธฐ๋ 16๋ฐ์ดํธ
// view๋ฅผ ํตํด ๊ฐ์ ์
๋ ฅ
view[0] = 123456; // ๋ถํ ๊ณต๊ฐ ์ค ์ฒซ๋ฒ์งธ์ 123456์ด๋ผ๋ ์ซ์๋ฐ์ดํฐ๋ฅผ ๋ฃ๋๋ค
for (let num of view) {
console.log(num); // 123456, 0, 0, 0
}
ArrayBuffer์ ์ํด ๊ตฌํ๋ ๊ฐ์ฒด๋ ๋ฐ์ดํฐ ๋ถ๋ถ์ ๋ํ๋ด๊ณ , view๋ ๋ฌธ๋งฅ์ ์ ๊ณตํด ์ค์ ๋ฐ์ดํฐ ํ์ํ ๋ฐฐ์ด๋ก ๋ฐ๊พผ๋ค.
Base64 → ArrayBuffer → Blob
base64 ๋ฐ์ดํฐ๋ฅผ blob์ผ๋ก ๋ฐ๊พธ๊ธฐ ์ํด ์ค๊ฐ ๊ณผ์ ์ผ๋ก arrayBuffer๊ฐ ์ฐ์ธ๋ค.
// bas64๋ฅผ blob์ผ๋ก ๋ณํํด์ฃผ๋ ํจ์
function b64toBlob(b64Data, contentType = '', sliceSize = 512) {
const image_data = atob(b64Data.split(',')[1]); // data:image/gif;base64 ํ์์์ผ๋ ๋ผ์ฃผ๊ณ , base64 ์ธ์ฝ๋ฉ์ ํ์ด์ค๋ค
const arraybuffer = new ArrayBuffer(image_data.length);
const view = new Uint8Array(arraybuffer);
for (let i = 0; i < image_data.length; i++) {
view[i] = image_data.charCodeAt(i) & 0xff;
// charCodeAt() ๋ฉ์๋๋ ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ๋ํ UTF-16 ์ฝ๋๋ฅผ ๋ํ๋ด๋ 0๋ถํฐ 65535 ์ฌ์ด์ ์ ์๋ฅผ ๋ฐํ
// ๋นํธ์ฐ์ฐ์ & ์ 0xff(255) ๊ฐ์ ์ซ์๋ฅผ ์์๋ก ํํํ๊ธฐ ์ํ ์ค์
}
return new Blob([arraybuffer], { type: contentType });
}
const contentType = 'image/png';
const b64Data =
'data:image/gif;base64,R0lGODlhAAEAAcQAALe9v9ve3/b393mDiJScoO3u74KMkMnNz4uUmKatsOTm552kqK+1uNLW18DFx3B7gP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjAxODAxMTc0MDcyMDY4MTE5QjEwQjYyNTc4MkUxRURBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjEzN0VEMDZBQjMyNzExRTE4REMzRUZGMkFCOTM1NkZBIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjEzN0VEMDY5QjMyNzExRTE4REMzRUZGMkFCOTM1NkZBIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzUgTWFjaW50b3NoIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MDI4MDExNzQwNzIwNjgxMTlCMTBCNjI1NzgyRTFFREEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MDE4MDExNzQwNzIwNjgxMTlCMTBCNjI1Nzgy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';
const blob = b64toBlob(b64Data, contentType); // base64 -> blob
const blobUrl = URL.createObjectURL(blob); // object url ์์ฑ
const img = document.createElement('img');
img.src = blobUrl;
document.body.appendChild(img);
Blob → ArrayBuffer
์ ํต์ ์ธ FileReader ๊ฐ์ฒด๋ก ๋ณํํ ์๋ ์๊ณ ,
let fileReader = new FileReader();
fileReader.readAsArrayBuffer(blob); // ArrauBuffer ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ณํ
fileReader.onload = function(event) {
let arrayBuffer = fileReader.result;
};
๋์ฉ๋ blob์ผ๊ฒฝ์ฐ ํ๋ก๋ฏธ์ค๋ฅผ ์ด์ฉํด ๋น๋๊ธฐ๋ก๋ ์ฒ๋ฆฌํ ์ ์๋ค.
const blob = new Blob(...);
const buf = await blob.arrayBuffer(); // ๋น๋๊ธฐ๋ก arrayBuffer๋ก ๋ณํ (๋์ฉ๋ ์ผ๊ฒฝ์ฐ)
ํธ๋ฒ์ผ๋ก blob์ ObjectURL๋ก ๋ฐ๊พธ๊ณ fetch๋ก ์์ฒญํด์ ํ๋ฐฉ์ arraybuffer๋ก ๋ณํํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํ๋ค.
// ํ๋ฐฉ์๋ ๊ฐ๋ฅ
fetch(URL.createObjectURL(myBlob))
.then(res => res.arrayBuffer())
Buffer
๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด Node.js๋ ์ง์๋ถํฐ Buffer ํ์ ์ ๋์ ํ๋ค
๋ฒํผ๋ ๊ณ ์ ๋ ํฌ๊ธฐ์ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ํํํ๊ธฐ ์ํ ํ์ ์ด๋ฉฐ, Node.js ์ ๋ง์ API๋ค์ด Buffer ํ์ ์ ์ง์ํ๋ค.
fs ๋ชจ๋๋ก ๋ก์ปฌ ํ์ผ์ ๊ฐ์ ธ์ค๋ ๊ฒ๋ ์ฌ์ค ๋ฒํผ๋ก ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ค.
ํด๋ผ์ด์ธํธ๋จ์์ ArrayBuffer๋ก ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ์๋ค๋ฉด, ์๋ฒ๋จ(Node.js)์์๋ Buffer ๊ฐ์ฒด๋ก ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฌ๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
Node.js์์ ๋ฉํฐ๋ฏธ๋์ด ํ์ผ์ ๋ค๋ฃฌ๋ค๊ณ ํ๋ฉด ๋ฌด์กฐ๊ฑด ๋ฒํผ๋ฅผ ์ด์ฉํด ๋ค๋ฃฌ๋ค ๋ผ๊ณ ์ดํดํ๋ฉด ๋๋ค.
์๋ฒ๋จ์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ ๋ค๋ฃจ๊ธฐ
๋ก์ปฌ์์ ์ด๋ฏธ์ง ํ์ผ์ ๊ฐ์ ธ์ค๋ฉด ๋ฐ๋ก ๋ฒํผ๋ก ๋ณํ๋์ ๋ณต์กํ ๊ณผ์ ์์ด ๋ฐ๋ก ์๋ฒ์์ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃฐ์ ์๊ฒ ์ง๋ง, ์๋ฒ์์ ajax๋ก ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ด๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์๋ ์์์ ๋ฐฐ์ด blob, arraybuffer๊ฐ ํ์ํ๋ค.
const fetch = require('node-fetch');
//* ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ
const img = await fetch('์ด๋ฏธ์งURL ํน์ base64์ด๋ฏธ์ง') // ์ด๋ฏธ์ง url์ fetch
.then((res) => res.blob()) // ๋ฐํ ์ด๋ฏธ์ง๋ฅผ blob์ผ๋ก ๋ณํ
.then(async (blob) => {
const arrayBuffer = await blob.arrayBuffer(); // blob์ arrayBuffer๋ก ๋ณํ
return Buffer.from(arrayBuffer); // ํด๋ผ์ด์ธํธ์ฉ ๋ฒํผ์ธ arrayBuffer๋ฃฐ ๋ค์ ์๋ฒ์ฉ buffer๋ก ๋ณํ
});
- ์ด๋ฏธ์ง๋ฅผ fetchํ๋ค
- ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๊ฐ์ blob์ผ๋ก ๋ณํํด์ค๋ค
- blob์ ๋น๋๊ธฐ๋ฅผ ํตํด arraybuffer๋ก ๋ณํํด์ค๋ค
- arraybuffer์ buffer๋ก ๋ณํํด์ค๋ค (blob์ buffer๋ก ๋ฐ๋ก ๋ณํ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ด์ ๊ฐ์ ๊ณผ์ ์ ์ดํ)
์ฌ์ค fetch ๋ชจ๋์์ ๋ฐ๋ก ๋ฒํผ๋ก ๋ณํํ ์ ์๋ ํฌํผ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ๋ฉด ๋๋ค. (๊ทธ๋๋ ๋ด๋ถ์ ์ผ๋ก๋ ์์ ๊ฐ์ด ๋์๋๋ค. ๊ณต๋ถํจ ๋ณด๋?!)
const fetch = require('node-fetch');
const img = await fetch(์ด๋ฏธ์งURL ํน์ base64์ด๋ฏธ์ง) // ์ด๋ฏธ์ง url์ fetch
.then((res) => res.buffer()) // ๋ฐํ ์ด๋ฏธ์ง๋ฅผ blob์ผ๋ก ๋ณํ
File & FileReader
ํ์ผ์ ์ฐ๋ฆฌ์๊ฒ ๋งค์ฐ ์ต์ํ ํ์ ์ด์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์์์ File ๊ฐ์ฒด๋ Blob ๊ฐ์ฒด๋ฅผ ํ์ฅํ ๊ฐ์ฒด๋ก ์ฃผ๋ก ํ์ผ์์คํ ๊ณผ ๊ด๋ จ๋ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ค.
ํ์ผ์์คํ ์ OS/์๋ฒ๋จ์ ์์ญ์ธ๋ฐ, ๋ธ๋ผ์ฐ์ ์์์๋ ํ์ผ์ ์ฃผ๊ณ ๋ฐ๋ ๋ฑ์ ๊ธฐ๋ฅ์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํ ๊ท๊ฒฉ์ผ๋ก ๋ณผ ์ ์๋ค.
๋ธ๋ผ์ฐ์ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด ํ์ผ์ ๋ค๋ฃจ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก๋ File ๊ฐ์ฒด๋ฅผ ์ด์ฉํ๊ฑฐ๋ html์ inputํ๊ทธ๋ฅผ ์ด์ฉํ๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
new File(fileParts, fileName, [options]);
/*
- fileParts : Blob / BufferSource / String ๊ณผ ๊ฐ์ ๋ฐฐ์ด
- fileName : ํ์ผ ์ด๋ฆ (๋ฌธ์์ด)
- options : ์ต์
๋ ๊ฐ. lastModified : ๋ง์ง๋ง ์์ ์ด ์ผ์ด๋ ๋์ timestamp
*/
<input type="file" onchange="showFile(this)">
<script>
function showFile(input) {
// input type='file' ์ ๊ฒฝ์ฐ ์ถ๊ฐ์ ์ผ๋ก multiple ์ต์
์ ์ง์ ํ ์ ์๋๋ฐ ์ด ๊ฒฝ์ฐ์๋ ๋ค๋์ File์ด ๋ฐฐ์ด ํํ๋ก ์ ๋ฌ๋๊ฒ ๋๋ค.
// ์ด๋๋ฅผ ๊ณ ๋ คํ์ฌ ๋จ์ผ ํ์ผ๋ง ์ ๋ฌ๋๋ ๊ฒฝ์ฐ์๋ File์ ํญ์ ์ ์ฌ ๋ฐฐ์ด๋ก ์ ๋ฌ๋๊ธฐ ๋๋ฌธ์ ํ๋์ ํ์ผ๋ง ๋ค๋ฃจ๋ ๊ฒฝ์ฐ์๋ ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ ๊ฒ์ ์ฃผ์ํ์
let file = input.files[0];
alert(`File name: ${file.name}`); // ํ์ผ ์ด๋ฆ
alert(`Last modified: ${file.lastModified}`); // ์ง๋ง ์์ ์ด ์ผ์ด๋ ๋์ timestamp
}
</script>
FileReader ๊ฐ์ฒด
์์์ ์ฌ์ฉํด๋ดค๋ FileReader๋ Blob ๋๋ File๊ณผ ๊ฐ์ ๊ฐ์ฒด๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ค์ด๊ธฐ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค.
์ฝ์ด๋ค์ธ ๋ฐ์ดํฐ๋ ์ฃผ๋ก ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ํ์ด๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
์์ฑ๋ FileReader ๊ฐ์ฒด์์ ์ฌ์ฉํ ์ ์๋ ์ฃผ์ ๋ฉ์๋๋ ์๋์ ๊ฐ๋ค.
const reader = new FileReader();
reader.readAsArrayBuffer(blob) // ArrauBuffer ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ณํ
reader.readAsText(blob, [encoding]) // encoding ๋ฐฉ์์ ๋ง๊ฒ ํ
์คํธ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ณํ (๊ธฐ๋ณธ ์ธ์ฝ๋ฉ ๋ฐฉ์ - utf-8)
reader.readAsDataURL(blob) // base64 ํํ์ data url๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ณํ
- readAsArrayBuffer(blob) : ArrauBuffer ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์
- readAsArrayBuffer์ ๊ฒฝ์ฐ ๋ฐ์ด๋๋ฆฌ ํ์ผ ๋์์ผ๋ก ๋ก์ฐ ๋ ๋ฒจ์ ๋ฐ์ด๋๋ฆฌ ์์ ์ด ํ์ํ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค. ๋๋ถ๋ถ ํ์ด๋ ๋ฒจ์์ ํ๋ ์์ ์ ๊ฒฝ์ฐ์ File ๊ฐ์ฒด๊ฐ Blob์ ์์๋ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ณ๋์ ์ฝ๊ธฐ ๊ณผ์ ์์ด ์ฆ๊ฐ์ ์ผ๋ก slice ๋ฑ์ ๋ฉ์๋ ํธ์ถ์ด ๊ฐ๋ฅํ๋ค.
- readAsText(blob, [encoding]) : encoding ๋ฐฉ์์ ๋ง๊ฒ ํ
์คํธ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ (๊ธฐ๋ณธ ์ธ์ฝ๋ฉ ๋ฐฉ์ - utf-8)
- readAsText์ ๊ฒฝ์ฐ ํ ์คํธ ํํ์ ๋ฌธ์์ด์ด ํ์ํ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
- readAsDataURL(blob) : base64 ํํ์ data url๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์
- readAsDataURL์ ๊ฒฝ์ฐ img ํ๊ทธ์ ๊ฐ์ด src ์์ฑ์ ๋ฆฌ์์ค๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
๋๋ ์ด์ ์ฑํฐ์์ ๋ค๋ฃฌ๋ฐ์ ๊ฐ์ด URL.createObjectURL์ ์ด์ฉํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
- readAsDataURL์ ๊ฒฝ์ฐ img ํ๊ทธ์ ๊ฐ์ด src ์์ฑ์ ๋ฆฌ์์ค๋ฅผ ๋ค๋ฃจ์ด์ผ ํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๋ค.
- abort() : ์์ ์ ์ฆ์ ์ค๋จ
FileReader ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ด๋ฒคํธ ๋ชฉ๋ก์ ๋ค์๊ณผ ๊ฐ๋ค.
const reader = new FileReader();
reader.readAsDataURL(blob) // base64 ํํ์ data url๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ๋ณํ
// ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฝ์ผ๋ฉด onload ์ด๋ฒคํธ๋ฅผ ๋ฐ์
reader.onload = () => {
const data = reader.result; // ๊ฒฐ๊ณผ ์ ์ฅ
console.log(data)
}
- loadstart : ๋ก๋ฉ์ด ์์๋ ๋
- progress : ์ฝ๊ธฐ๋ฅผ ์ํํ๊ณ ์๋ ์ค
- load : ์๋ฌ ์์ด ๋ฆฌ๋ฉ์ด ์๋ฃ๋ ๋
- abort : abort() ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋
- error : ์๋ฌ๊ฐ ๋ฐ์ํ ๋
- loadend : ์ฑ๊ณต/์คํจ ์ฌ๋ถ ์๊ด์์ด ๋ฆฌ๋ฉ์ด ์๋ฃ๋ ๋
๋ง์ฝ ์ฝ๊ธฐ๊ฐ ๋ชจ๋ ์๋ฃ๋์๋ค๋ฉด ๊ทธ์ ๋ํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ ํ๋กํผํฐ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- reader.result : ์ฑ๊ณต ์ ์ฝ์ด๋ค์ธ ๊ฒฐ๊ณผ
- reader.error : ์คํจ ์ ๋ฐ์ํ ์๋ฌ
๋ค์์ FileReader๋ฅผ ์ด์ฉํด, ๋ธ๋ผ์ฐ์ ์์ ํ์ผ์ฒจ๋ถ๋ฅผ ํ๋ฉด ํ์ผ์ base64ํํ๋ก ๋ณํํด ์ด๋ฏธ์ง๋ก ๋์ฐ๋ ์์ ์ฝ๋์ด๋ค.
<img src="">
<input type='file' onchange='readFile(this)' />
<script>
function readFile(input) {
const file = input.files[0]; // ์ฒจ๋ถ๋ ํ์ผ์ ๊ฐ์ ธ์ด
const reader = new FileReader();
reader.readAsDataURL(file); // ํ์ผ์ base64๋ก ๋ณํ
reader.onload = function() {
console.log(reader.result); // ์ฝ์ ํ์ผ ์์ค๋จ์ ์ถ๋ ฅ
document.querySelector('img').src = reader.result;
};
reader.onerror = function() {
console.log(reader.error);
};
}
</script>
See the Pen FileReader to Base64 IMG by barzz12 (@inpaSkyrim) on CodePen.
# ์ฐธ๊ณ ์๋ฃ
https://ko.javascript.info/binary
https://heropy.blog/2019/02/28/blob/
https://www.csharpstudy.com/Tip/Tip-base64.aspx
https://curryyou.tistory.com/440
https://im-designloper.tistory.com/57
https://creatordev.tistory.com/97
https://velog.io/@longroadhome/%EB%AA%A8%EB%8D%98JS-%EC%8B%AC%ED%99%94-%EB%B0%94%EC%9D%B4%EB%84%88%EB%A6%AC-%EB%8D%B0%EC%9D%B4%ED%84%B0%EC%99%80-%ED%8C%8C%EC%9D%BC
https://velog.io/@yijaee/Buffer%EC%99%80-Stream