Front-end ๐Ÿ”ฅ๐Ÿ–ค/JavaScript

[JavaScript] ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ์ค‘ ๋ง‰ํžŒ ๋ถ€๋ถ„ - ํ”„๋กœํ•„ ์‚ฌ์ง„ ์ ์šฉํ•˜๊ธฐ

stable_sound 2022. 5. 30. 23:07

๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

๋‚˜์˜ ๊ณ„ํš์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • (์ดˆ๊ธฐ์— ์„ค์ •ํ•œ) ์‚ฌ์šฉ์ž์ด๋ฆ„์„ ์ƒˆ๋กœ ๋ฐ”๊ฟ€ ๋•Œ , ๊ธฐ๋ณธ ์ด๋ฏธ์ง€์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ์ง์ ‘ ์„ ํƒํ•˜์—ฌ ์ ์šฉํ•œ ๊ฒฝ์šฐ localStorage์— ์ €์žฅ๋œ๋‹ค.
  • ์ƒˆ๋กœ๊ณ ์นจํ•˜์—ฌ๋„ ๋‘ ๊ฐ’์ด ์œ ์ง€๋œ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„๊ณผ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ํ•œ๋ฒˆ ๋” ์ˆ˜์ •ํ•˜๋ฉด ์ˆ˜์ •ํ•œ ๊ฐ’์ด ์ถœ๋ ฅ๋œ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ถ€๋ถ„์€ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ  ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ ๋‹ค๋ฃฌ๋‹ค.

 


(*css ์ฝ”๋“œ๋Š” ๋ฏธํฌํ•จ)

 

์ดˆ๊ธฐ์— ์„ค์ •ํ•ด๋‘” ์‚ฌ์šฉ์ž์˜ ์ด๋ฆ„์€ '์ถ˜์‹์ด'์ด๊ณ  ํ”„๋กœํ•„ ์‚ฌ์ง„์€ ์•„๋ฌด๊ฒƒ๋„ ์ง์ ‘ ์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ด๋ฏธ์ง€๊ฐ€ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ๋‹ค.

๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋Š” html์„ ์„ค์ •ํ•  ๋•Œ ์•„์˜ˆ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค.

 

<div class="info">
  <h2 class="userName"></h2>
  <input type="text" class="userName_input" maxlength="12">
  <input type="file" name="profile_img" accept="image/*" class="profile_img">
  <figure class="profileImg_btn">
   <img src="img/bros_blank.jpg" alt="๊ธฐ๋ณธ์ด๋ฏธ์ง€">
  </figure>
</div>

 

๊ธฐ๋ณธ ์ด๋ฏธ์ง€๋ฅผ ํด๋ฆญํ•˜๋ฉด ์‚ฌ์ง„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋„๋ก ํŒŒ์ผ ์ฐพ๊ธฐ ํ™”๋ฉด์ด ๋œฌ๋‹ค.

์™œ์ด๋ ‡๊ฒŒ ๊นจ์ง€์ง€

 

์ €๊ธฐ์„œ ์‚ฌ์ง„์„ ํ•˜๋‚˜ ๊ณจ๋ผ ์ ์šฉํ•ด๋ณธ๋‹ค.

 

์ ์šฉ์ด ์ž˜๋œ๋‹ค! ์ƒˆ๋กœ ๊ณ ์นจ์„ ํ•ด๋„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๊ณ  ์ œ๋Œ€๋กœ ๋‚˜ํƒ€๋‚œ๋‹ค.

์ƒˆ๋กœ๊ณ ์นจ ์ค‘ ....

localStorage ์—๋„ ์ œ๋Œ€๋กœ ์ €์žฅ๋˜๊ณ  ์žˆ๋‹ค. ์‚ฌ์ง„์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ด๊ณณ์˜ ๊ฐ’๋„ ๋ฐ”๋€๋‹ค.

 

 

์†Œ์Šค ์ฝ”๋“œ (์ตœ์ข…์ฝ”๋“œ)

/* ํ”„๋กœํ•„ ์‚ฌ์ง„ */

const profileBtn = document.querySelector(".profileImg_btn");
const profileInput = document.querySelector(".profile_img");
const profileIcon = document.querySelector(".fa-user-plus");
const img = document.querySelector(".profileImg_btn img");
const fileTypes = [
  "image/apng",
  "image/bmp",
  "image/gif",
  "image/jpeg",
  "image/pjpeg",
  "image/png",
  "image/svg+xml",
  "image/tiff",
  "image/webp",
  "image/x-icon",
];

const NAME_KEY = "exam";
const PROFILE_IMG = "exImg";

/* ํ”„๋กœํ•„ ์‚ฌ์ง„ ๋ณ€๊ฒฝ */
profileBtn.addEventListener("click", () => {
  profileInput.click();
});

function handleProfileImg() {
  // ์„ ํƒํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ currentFiles ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค.
  const currentFiles = profileInput.files;
  if (profileBtn.children.length > 0) {
    // ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ๋‘๊ฐœ์ด๋ฉด ์ฒ˜์Œ ์‚ฌ์ง„์„ ์ง€์šฐ๊ณ  ํ•˜๋‚˜๋งŒ ๋„์šด๋‹ค.
    localStorage.removeItem(PROFILE_IMG);
    //profileBtn.children[0].remove();
  }

  // ๋งŒ์•ฝ, ํŒŒ์ผ์ด ์—†์œผ๋ฉด ๊ฒฝ๊ณ ์ฐฝ์„ ๋„์šด๋‹ค.
  if (currentFiles.length === 0) {
    alert("No files currently selected for upload");
  } else {
    // for of ๋Š” ๋ฐฐ์—ด
    for (const file of currentFiles) {
      // ๋งŒ์•ฝ, file์˜ ํƒ€์ž…์ด fileTypes ์— ํฌํ•จ๋˜๋ฉด 
      if (validFileType(file)) {
        // FileReader ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
        const reader = new FileReader();
        // ํŒŒ์ผ์„ ์ฝ์—ˆ์„ ๋•Œ ํ•ด๋‹น ์ด๋ฒคํŠธ ์‹คํ–‰
        reader.addEventListener("load", () => {
          // localStorage์— PROFILE_IMG ๋ฅผ key๋กœ ๊ฐ€์ง„ reader.result๋ฅผ ์ฝ๋Š”๋‹ค.
          localStorage.setItem(PROFILE_IMG, reader.result);
          // reader.result๋ฅผ ์ด๋ฏธ์ง€์˜ src์— ๋„ฃ์–ด ํ™”๋ฉด์— ๋ณด์—ฌ์ค€๋‹ค.
          img.src = reader.result;
        });
        // ์—…๋กœ๋“œ ๋œ ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์ฝ๋Š”๋‹ค.
        reader.readAsDataURL(file);
      } else {
        alert("Not a valid file type. Update your selection.");
      }
    }
  }
  function validFileType(file) {
  return fileTypes.includes(file.type);
}
}

profileInput.addEventListener("change", handleProfileImg);

 


 

์ˆ˜์ •ํ•œ ๋ถ€๋ถ„

 

๊ธฐ์กด ์ฝ”๋“œ์—์„œ ์ˆ˜์ •ํ•œ ๋ถ€๋ถ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

// ์ˆ˜์ • ์ „

localStorage.setItem(PROFILE_IMG, file.name);  
loadImgUrl(reader.result);
.....
}


function loadImgUrl(DataUrl) {
  const image = document.createElement("img");
  //profileIcon.remove()
  profileBtn.appendChild(image);
  image.src = DataUrl;
}  


// ์ˆ˜์ • ํ›„
localStorage.setItem(PROFILE_IMG, reader.result);
img.src = reader.result;
......

 

  • ์ˆ˜์ • ์ „
    localStotage์— PROFILE_IMG ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’ (key)์„ ๊ฐ€์ง„ file.name์„ ์ฝ๊ณ , 
    loadImgUrl() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ profileBtn์˜ ์ž์‹ ์š”์†Œ๋กœ ์ง€์ •ํ•œ๋‹ค.
    ๊ทธ ํ›„, loadImgUrl  ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„์˜จ DataUrl์„ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€ ํƒœ๊ทธ์˜ src ๊ฐ’์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.
  • ์ˆ˜์ • ํ›„
    localStorage์— PROFILE_IMG ๋ณ€์ˆ˜์— ์ €์žฅ๋œ ๊ฐ’ (key)์„ ๊ฐ€์ง„ reader.result ๋ฅผ ์ฝ๊ณ ,
    loadImgUrl() ํ•จ์ˆ˜๋ฅผ ์•„์˜ˆ ์‚ญ์ œํ•˜๊ณ  ๊ณง๋ฐ”๋กœ ๋ณธ๋ž˜ ๊ธฐ๋ณธ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ img ํƒœ๊ทธ์˜ src ๊ฐ’์œผ๋กœ reader.result๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

 

์ˆ˜์ • ์ „ ์ฝ”๋“œ๋Š” .. ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผํ• ์ง€ ๋ชฐ๋ผ ์—ฌ๊ธฐ์ €๊ธฐ์—์„œ ๋ณธ ๊ฒƒ์„ ์งœ์ง‘๊ธฐ ํ•ด์„œ ๊ทธ๋Ÿฐ์ง€ ใ… 

์ด๋ฏธ img ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š”๋ฐ ์Œฉ๋šฑ๋งž๊ฒŒ ๋˜ ๋งŒ๋“ค๊ณ  ๊ฑฐ๊ธฐ์— ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ๋„ฃ๊ณ  ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ๋‹น์—ฐํžˆ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด ์‚ฌ๋ผ์ ธ์„œ ์•ˆ๋ณด์ด์ง€ ...!!!ใ…‹ใ…‹ใ…‹ํใ… ใ… 

 

์—‰๋šฑํ•˜๊ฒŒ ์ฝ”๋“œ๋ฅผ ์งœ๋†“๊ณ  ์˜ค๋žœ ์‹œ๊ฐ„ ํ—ค๋งธ๋‹ค๋Š”๊ฒŒ ์–ด์ด์—†๊ณ  ์›ƒ๊ธฐ๋‹ค.

 

๊ทธ์น˜๋งŒ ๊ทธ๋• ์ •~~~๋ง javascript ์ดˆ๋ฐ˜์ด์—ˆ์„ ๋•Œ๊ณ  ์ง€๊ธˆ์€ ๊ทธ๋ž˜๋„ ๋ช‡๋ฒˆ ํ•ด๋ดค๋‹ค๊ณ  ์ฝ”๋“œ ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ ๋” ์„ฑ์žฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๊ทธ๋ž˜์„œ  ๋ญ๊ฐ€ ์ž˜๋ชป๋œ๊ฑด์ง€ ๋ฐ”๋กœ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋˜๊ฑฐ๊ฒ ์ง€?

 

๋А๋ฆฌ์ง€๋งŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์— ๋„ˆ๋ฌด ๋ฟŒ๋“ฏํ•˜๋‹ค!