β—οΈπŸ“š μ—λŸ¬λ…ΈνŠΈ - DOMException: The requested file could not be read, typically due to permission problems that have occurred after a reference to a file was acquired.

κΉ€μ˜€κ·ΌΒ·2020λ…„ 5μ›” 16일
0

μ—λŸ¬λ…ΈνŠΈ

λͺ©λ‘ 보기
2/2

μ—λŸ¬λ°œμƒ

input μš”μ†Œμ— νŒŒμΌμ„ μ˜¬λ €λ†“κ³  νŒŒμΌμ„ μ½λŠ” κ³Όμ •μ—μ„œ λ‹€μŒκ³Ό 같은 μ—λŸ¬κ°€ λ°œμƒν•˜μ˜€λ‹€.

DOMException: The requested file could not be read,
typically due to permission problems that have occurred
after a reference to a file was acquired.

μ—λŸ¬λ₯Ό λ°œμƒν•˜λŠ” 쑰건은 크게 2가지 κ²½μš°μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν•˜μ˜€λ‹€.

  1. input μš”μ†Œμ— νŒŒμΌμ„ μ˜¬λ €λ†“κ³  컴퓨터에 μžˆλŠ” 파일λͺ…을 λ³€κ²½ν•œ 경우
  2. input μš”μ†Œμ— νŒŒμΌμ„ μ˜¬λ €λ†“κ³  컴퓨터에 μžˆλŠ” 파일의 λ‚΄μš©μ„ λ³€κ²½ν•œ 경우

input μš”μ†Œμ— νŒŒμΌμ„ μ˜¬λ €λ†“κ³  νŒŒμΌμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό 얻은 ν›„ 원본 νŒŒμΌμ— λŒ€ν•œ 변경이 μΌμ–΄λ‚˜μ„œ νŒŒμΌμ— λŒ€ν•œ κΆŒν•œ λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ ν•΄λ‹Ή μ—λŸ¬κ°€ λ°œμƒν•œ κ²ƒμœΌλ‘œ νŒŒμ•…λ˜μ—ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄ input μš”μ†Œμ—μ„œ νŒŒμΌμ„ λ‹€μ‹œ μ„ νƒν•˜μ—¬ νŒŒμΌμ— λŒ€ν•œ μ°Έμ‘°λ₯Ό λ‹€μ‹œ μ–»μœΌλ©΄ λ˜μ§€ μ•Šμ„κΉŒ λΌλŠ” 생각을 ν•˜μ˜€λ‹€. ν•˜μ§€λ§Œ μƒˆλ‘œμš΄ 문제점이 λ°œμƒν•˜κ²Œ λ˜μ—ˆλ‹€.

input μš”μ†ŒλŠ” λ™μΌν•œ 파일λͺ…μ˜ νŒŒμΌμ„ λ‹€μ‹œ μ„ νƒν•˜λ©΄ μƒˆλ‘­κ²Œ 파일이 μ°Έμ‘°λ˜μ§€ μ•ŠλŠ” λ‹€λŠ” μ μ΄μ—ˆλ‹€.

μ—λŸ¬μƒν™©

λ‹€λ₯Έ 파일λͺ…을 선택해야 μƒˆλ‘­κ²Œ νŒŒμΌμ— λŒ€ν•œ 정보가 μ½˜μ†”μ— μ°νžˆλŠ” 것을 λ³Ό μˆ˜κ°€ μžˆλ‹€.

해결방법

import React, { useState, useRef } from "react";

const App = () => {
  const [file, setFile] = useState(null);
  const fileInput = useRef();

  const onChange = (e) => {
    setFile(e.target.files[0]);
  };

  const onClick = (e) => {
    e.target.value = null;
  };

  const readFile = () => {
    if (file) {
      const fileReader = new FileReader();
      fileReader.onload = (e) => {
        console.log(e.target.result);
      };
      fileReader.onerror = (e) => {
        if (e.type === "error") {
          fileInput.current.value = null;
          return alert("μ—λŸ¬λ°œμƒ! νŒŒμΌμ„ λ‹€μ‹œ μ„ νƒν•΄μ£Όμ„Έμš”.");
        }
      };

      fileReader.readAsText(file);
    } else {
      return alert("파일이 μ—†μŠ΅λ‹ˆλ‹€.");
    }
  };

  return (
    <div>
      <div>
        <input
          type="file"
          ref={fileInput}
          onChange={onChange}
          onClick={onClick}
        />
      </div>
      <div>
        <button onClick={readFile}>파일 읽기</button>
      </div>
    </div>
  );
};

export default App;
  1. λ™μΌν•œ 파일λͺ…에 λŒ€ν•œ 이슈λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•˜μ—¬ input μš”μ†Œμ— click μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λŠ” μˆœκ°„ ν•΄λ‹Ή target의 valueλ₯Ό nullκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•˜λŠ” 과정을 μ„ ν–‰μ μœΌλ‘œ μ§„ν–‰ν•˜κ²Œ λ§Œλ“€μ—ˆλ‹€.

  2. 파일 변경에 λŒ€ν•œ 이슈λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•˜μ—¬ 파일 μ°Έμ‘° κΆŒν•œμ— λŒ€ν•œ μ—λŸ¬κ°€ λ°œμƒν•œ κ²½μš°μ—λ„ ν•΄λ‹Ή target의 valueλ₯Ό nullκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”λ₯Ό μ§„ν–‰ν•˜μ˜€λ‹€.

click 이벀트λ₯Ό ν†΅ν•˜μ—¬ νŒŒμΌμ„ λ³€κ²½ν•œκ²Œ μ•„λ‹ˆλΌ change 이벀트λ₯Ό ν†΅ν•˜μ—¬ νŒŒμΌμ„ μ„ νƒν•œ κ²½μš°μ— 2번 방법을 ν†΅ν•˜μ—¬ μ—λŸ¬λ₯Ό 해결이 κ°€λŠ₯ν–ˆλ‹€. onChange ν•¨μˆ˜μ— ν•΄λ‹Ή target의 valueλ₯Ό nullκ°’μœΌλ‘œ μ΄ˆκΈ°ν™” ν•˜λŠ” λ‘œμ§μ„ λ„£μœΌλ©΄ 계속 input μš”μ†Œμ— 파일이 μ—†κΈ° λ•Œλ¬Έμ— onChange ν•¨μˆ˜μ—λŠ” μ΄ˆκΈ°ν™” λ‘œμ§μ„ 넣지 μ•Šμ•˜λ‹€.

κ²°λ‘ 

μ‚¬μš©μžκ°€ ν•΄λ‹Ή κΈ°λŠ₯을 μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ•Œ 수 μ—†λŠ” μƒν™©μ—μ„œ 항상 μ—λŸ¬ λŒ€ν•œ μΌ€μ΄μŠ€λ₯Ό μž‘μ•„λ‚΄λŠ” 과정은 항상 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•œλ‹€. input μš”μ†Œμ— 올린 νŒŒμΌμ„ μˆ˜μ •μ„ ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 보μž₯이 μ—†κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή μ—λŸ¬κ°€ λ°œμƒν•œ 경우 μœ μ €λ“€μ—κ²Œ μ΅œλŒ€ν•œ μ—λŸ¬ μΌ€μ΄μŠ€λ₯Ό ν•΄κ²°μ£ΌλŠ” μ½”λ“œλŠ” 항상 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•œλ‹€. μ–Έμ œλ‚˜ μš°λ¦¬λ“€μ€ μœ μ €λ“€μ„ 믿으면 μ•ˆλœλ‹€. μƒκ°ν•˜μ§€ λͺ»ν•œ λ°©λ²•μœΌλ‘œ κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

profile
πŸ‘¨πŸ»β€πŸ’» 우린 닡을 찾을 것이닀. 늘 κ·Έλž¬λ“―μ΄(ꡬ글링을 ν†΅ν•΄μ„œ)

0개의 λŒ“κΈ€