ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ก์ปฌ PC์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ณ ์ ์ฅํ๊ธฐ_ํ์ ์คํฌ๋ฆฝํธ ๋ด์์ ๋น๋๊ธฐ ์์ ์ ํตํ FileReader ์ธ์คํด์ค ์ฌ์ฉ๊ธฐ
choi95 2022. 4. 11. 20:50Issue
ํ๋ก์ ํธ ์ค, ๋ก์ปฌ PC์์ ๊ฐ์ ธ ์จ ์ด๋ฏธ์ง๋ฅผ preview๋ก ๋ณด์ฌ์ฃผ๋ฉฐ ์ ์ฅํ๋ ๊ธฐ๋ฅ ๊ตฌํ์ด ํ์ํ๋ค.
์ฒ์์๋ ๊ฐ๋จํ ๊ธฐ๋ฅ ๊ตฌํ์ผ ์ค ์์์ง๋ง ์๊ฐ๋ณด๋ค ๋ง์ ์ํ์ฐฉ์ค๋ฅผ ๊ฒช์๊ธฐ์ ํด๋น ๋ด์ฉ์ ํฌ์คํ ํ๊ณ ์ ํ๋ค.
Code
1) Input ์คํ์ผ ์ปค์คํฐ๋ง์ด์ง
์ฐ์ , Input ํ๊ทธ ๋ด์ 'type=file' ์์ฑ์ ์ง์ ํด์ฃผ๋ฉด ๋ก์ปฌ PC์์ ์ด๋ฏธ์ง ์์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ง๋ง ๊ธฐ๋ณธ ์ง์ ์คํ์ผ์ด ์ํ๋ ๋ฐฉํฅ์ด ์๋๊ธฐ์ ๋ค์๊ณผ ๊ฐ์ด JSX๋ฅผ ์์ฑํ์๋ค.
<>
<S.FileBox>
<S.FileLabel htmlFor="file">๋ด PC์์ ๋ถ๋ฌ์ค๊ธฐ</S.FileLabel>
<S.FetchLocalPC type="file" id="file" onChange={storeImage}/>
</S.FileBox>
<>
์ค์ ๋ก์ปฌ PC์์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ FetchLocalPC ์ปดํฌ๋ํธ์ด์ง๋ง ์คํ์ผ์ ์ปค์คํฐ๋ง์ด์งํ๊ธฐ ์ํด์ FileLabel ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ก ๋ง๋ค์ด ๋ ์ปดํฌ๋ํธ์ ๋ค์๊ณผ ๊ฐ์ด ์คํ์ผ์ ์ง์ ํด์ฃผ์๋ค.
export const FileLabel = styled.label`
padding: 20px 50px;
border: 1px solid #f0f0f0;
border-radius: 2px;
font-size: 20px;
line-height: 3;
background-color: #f0f0f0;
color: #616161;
cursor: pointer;
`;
export const FetchLocalPC = styled.input`
position: absolute;
width: 0;
height: 0;
padding: 0;
overflow: hidden;
border: 0;
`;
๊ธฐ๋ฅ์ ๋ด๋นํ๋ FetchLocalPC ์ปดํฌ๋ํธ์ ์์น๊ฐ๊ณผ ์คํ์ผ์ ๋ชจ๋ ์ด๊ธฐํํด์ฃผ๊ณ ์ค์ ์คํ์ผ์ ๋ด๋นํ FileLabel ์ปดํฌ๋ํธ์ ์ํ๋ CSS ์์ฑ์ ์ง์ ํด์ค์ผ๋ก์จ ์คํ์ผ์ ์ปค์คํฐ๋ง์ด์ง ํด์ฃผ์๋ค.
2) ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ File ์ธํฐํ์ด์ค ์ฐธ์กฐํ๊ธฐ
ํด๋น input ํ๊ทธ์์ click ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์์ ๋ ๋ก์ปฌ PC์์ ๊ฐ์ ธ์จ ์ด๋ฏธ์ง์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ files ์ฐธ์กฐํ์๋ค.
https://developer.mozilla.org/ko/docs/Web/API/File
File ์ธํฐํ์ด์ค๋ ํ์ผ์ ๋ํ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ , ์น ํ์ด์ง์ JavaScript๊ฐ ํด๋น ๋ด์ฉ์ ์ ๊ทผํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. File ๊ฐ์ฒด๋ ๋ณดํต FileList ๊ฐ์ฒด์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๋ค์์ fileList๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ files์ ํ๋กํผํฐ์ ๋ํ ์ฝ์ ๊ฒฐ๊ณผ์ด๋ค.
FileList {0: File, length: 1}0: FilelastModified: 1648878872817lastModifiedDate: Sat Apr 02 2022 14:54:32 GMT+0900 (ํ๊ตญ ํ์ค์) {}name: "image4.jpeg"size: 79784type: "image/jpeg"webkitRelativePath: ""[[Prototype]]: Filelength: 1[[Prototype]]: FileList
ํด๋น ํ๋ก์ ํธ์์ ๋จ์ผ ์ด๋ฏธ์ง ์ ํ ๊ธฐ๋ฅ ๋ฐ์ ํ์์๊ธฐ ๋๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ด fileList ๋ด์์ 0๋ฒ์งธ ์ธ๋ฑ์ค์ ์ ์ฌ๋ file ์ธํฐํ์ด์ค ๊ฐ์ ์ฐธ์กฐํ์๋ค.
const storeImage = async (e: React.ChangeEvent<HTMLInputElement>) => {
// ํด๋น async/await ๊ตฌ๋ฌธ์ด ์ ํ์ํ์ง ๋ค์ ๋จ๊ณ์์ ์ค๋ช
const target = e.target as HTMLInputElement;
const result = target.files && await parseFile(target.files[0]);
}
3) ๋น๋๊ธฐ ์์ ๊ณผ ํจ๊ป FileReader ์ธ์คํด์ค ์ฌ์ฉ
ํด๋น file ์ธ์คํด์ค๋ง์ ์ด์ฉํด์๋ ํด๋ผ์ด์ธํธ ์ธก์์ ์ด๋ฏธ์ง ์์ค๋ฅผ ์ ์์ ์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ด๋ฏธ์ง ์์ค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ FileReader ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
https://developer.mozilla.org/ko/docs/Web/API/FileReader
FileReader ๊ฐ์ฒด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํ์ฌ ์ฝ์ ํ์ผ์ ๊ฐ๋ฆฌํค๋ File ํน์ Blob ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ํ์ผ์ ๋ด์ฉ์(ํน์ raw data๋ฒํผ๋ก) ์ฝ๊ณ ์ฌ์ฉ์์ ์ปดํจํฐ์ ์ ์ฅํ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋๋ค.
const processFile = (currentFile: File): Promise<string | ArrayBuffer | null> => {
return new Promise(resolve => {
const reader = new FileReader();
reader.readAsDataURL(currentFile);
reader.onload = () => {
const result = reader.result;
resolve(result);
}
})
}
FileReader ๊ฐ์ฒด ์ค readAsDataURL ๋ฉ์๋๋ File ๊ฐ์ฒด๋ฅผ ์น ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ฝ์ ์ ์๋๋ก Buffer ํ์์ผ๋ก ๋ณํํ๋ค.
์ฌ๊ธฐ์ ์ค์ํ ์ ์ onload ๋ฉ์๋์ด๋ค.
onload ๋ฉ์๋๋ FileReader ๊ฐ์ฒด๊ฐ ์ฝ๊ธฐ ์์ ์ ๋ง์น๊ณ ์ด๋ ํ ์์ ์ ํ ์ง ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋๊ธฐ๋๋ฐ, ์ด๋ ํด๋น ์ฝ๋ฐฑ ํจ์์ ์คํ์ด ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ํ๋ค.
๋น๋๊ธฐ ์์ (pending ์ํ)์ด ์ ๋๋ก ์ด๋ค์ง๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ด async/await ํจ์๋ฅผ ์ฌ์ฉํ์ฌ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํ๋ฐ๋๋ก ์ฝ๋๋ฅผ ์์ฑํ์๋ค.
export const parseFile = async (currentFile: File) => {
const parsedFile: string | ArrayBuffer | null = await processFile(currentFile);
return parsedFile;
}
ArrayBuffer Type?
ํ์ ์คํฌ๋ฆฝํธ๋ก ํ๋ก์ ํธ๋ฅผ ํ๋ค๋ณด๋ ๋ชจ๋ ๊ฐ์ ๋ํ ํ์ ์ ์ง์ ํด์ค์ผ ๋ฌ๋๋ฐ, FileReader ๊ฐ์ฒด์์ ๋ฐํํ ๊ฐ์ ํ์ ์คArrayBuffer ๋ผ๋ ํ์ ์ด ์์ด, Buffer์ ๋ํ ์๋ฌธ์ด ๋ค์๋ค.https://curryyou.tistory.com/441
ํด๋น ํฌ์คํ ์์ Buffer ๊ฐ๋ ์ ๋ํด์ ํ์ธํ ์ ์์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋ฒํผ๋ ํน์ ํฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด๋๋ ๊ฐ์ฒด์ด๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ง์ ํ๋ ๊ฒ์ ํ์ฉํ์ง ์๋๋ค.
ํ์ง๋ง ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฉ๋๊ฐ ๋ค์ํด์ง๋ฉด์ ์ค๋์ค, ๋น๋์ค ๋ฐ ์น์์ผ ํต์ ์์ ์ฌ์ฉํ๋ Raw Binary Data๋ฅผ ์ง์ ๋ค๋ฃฐ ํ์๊ฐ ์๊ฒผ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ์ ํจ์จ์ฑ์ ๋์ด๊ธฐ ์ํด Buffer๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ค.
(์ด ์ค ArrayBuffer๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ๋งํผ์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฐ์ฒด์ด๋ค)
๊ตฌํ ์์