본문 바로가기

웹표준/Offline & storage

4. File API

HTML5의 DOM으로 추가된 File API를 사용해서 웹 컨텐츠가 사용자에게 로컬 파일을 선택한 후 파일의 컨텐츠를 읽도록 요청가능.

<input>태그나 드래긍 앤 드랍으로도 사용

 

선택한 파일에 접근

하나의 파일만 선택한 경우, 리스트의 첫 번째 파일만 고려하면됨

<input type="file" id="input">
const selectedFile = document.getElementById('input').files[0];

 

change 이벤트를 통해 FileList에 접근할수있다. 

단, 아래와같이 EventTarget.addEventListner()를 사용해야한다.

<input type="file" id="input" onchange="handleFiles(this.files)">
const inputElement = document.getElementById("input");
inputElement.addEventListener("change", handleFiles, false);
function handleFiles() {
  const fileList = this.files; /* 이제 파일 리스트로 작업할 수 있습니다 */
}

*handleFies() 함수 자체가 이벤트 핸들러임.

 

선택한 파일에 대한 정보 얻기

DOM에 의해 제공된 FileList객체의 lenght만큼 순환하여 정보를 얻을 수 있음.

const numFiles = files.length;  //FileList의 길이

for (let i = 0, numFiles = files.length; i < numFiles; i++) { //for문으로 FileList 순회
  const file = files[i];
  ..
}

 아래 3가지 속성으로 file의 정보를 얻음

  • name : 파일명 (경로X) 
  • size : 파일 단위의 크기
  • type : 파일의 MIME타입

size 속성의 사용예시

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File(s) size</title>
<script>
function updateSize() {
  let nBytes = 0,
      oFiles = document.getElementById("uploadInput").files,
      nFiles = oFiles.length;
  for (let nFileId = 0; nFileId < nFiles; nFileId++) {
    nBytes += oFiles[nFileId].size;
  }
  let sOutput = nBytes + " bytes";
  // multiples approximation을 위한 선택적 코드
  for (let aMultiples = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"], nMultiple = 0, nApprox = nBytes / 1024; nApprox > 1; nApprox /= 1024, nMultiple++) {
    sOutput = nApprox.toFixed(3) + " " + aMultiples[nMultiple] + " (" + nBytes + " bytes)";
  }
  // 선택적 코드의 끝
  document.getElementById("fileNum").innerHTML = nFiles;
  document.getElementById("fileSize").innerHTML = sOutput;
}
</script>
</head>

<body onload="updateSize();">
<form name="uploadForm">
<p><input id="uploadInput" type="file" name="myFiles" onchange="updateSize();" multiple> selected files: <span id="fileNum">0</span>; total size: <span id="fileSize">0</span></p>
<p><input type="submit" value="Send file"></p>
</form>
</body>
</html>