2021. 7. 27. 14:51ㆍJS
HTML5 부터 브라우저는 File API 지원하기 시작한다.
File API 는 아래와 같이 정의되어 있다.
- FileList : 파일 리스트
- File : 파일 데이터
- FileReader : 파일 읽기
- Blob : 바이트 데이터
간단예제
const captureProfile = (event) => {
event.stopPropagation();
event.preventDefault();
const file = event.target.files[0];
let reader = new window.FileReader();
reader.readAsArrayBuffer(file);
let inputId = event.target.id;
reader.onloadend = () => {
convertToBuffer(reader, inputId);
};
};
const convertToBuffer = async (reader, inputId) => {
const buffer = await Buffer.from(reader.result);
let uploadImage = URL.createObjectURL(
new Blob([buffer], { type: 'image/png' }
));
if (inputId === 'uploadId') {
setProfile(uploadImage);
}
else if (inputId === 'bannerUpload') {
setBanner(uploadImage);
}
};
해당 예제는 input[type=file] 로 입력받은 파일을 converToBuffer 함수에 props를 전달하여 Buffer 배열을
Binary Large Object 객체를 만들어 프로필 이미지를 변경하는 예제이다.
input file type
기본적으로 브라우저에서는 보안상 로컬 파일에 직접 접근 할 수 없다.
input[type=file] 는 브라우저에서 유저가 직접 로컬의 파일을 선택할 수 있게 도와준다.
https://html.spec.whatwg.org/multipage/input.html#file-upload-state-%28type=file%29
이렇게 선택한 파일은 File 로 정의되고 FileList 에 담기게 된다.
이때 multiple 설정 여부와 관계없이 ArrayLike 형태인 FileList 로 담긴다.
파일을 선택하면 input, change EventHandler 가 발생되며, 선택된 파일은 HTMLInputElement.files 에 저장된다.
oninput 와 onchange 는 input.files 이 변경될때, 발생하는 점은 유사 하다.
유일한 차이점은 onchange 는 포커스를 잃을 때 발생하고, oninput 은 요소 값이 변경된 직후에 발생한다.
때문에 순서상으로 oninput 이 먼저 발생한다.
input 의 속성
input[type=file] 은 value, accept, capture, files, multiple 속성을 갖을 수 있다.
- value [DOMString] : 파일 경로
- accept [MIME] : 사용 가능한 파일 종류
- capture [string] : 파일 캡처 방법
- multiple [boolean] : 여러 파일 선택 여부
- files [FileList] : 선택된 파일들
input.value
input[type=file] value 에는 파일의 경로를 가진다.
브라우저에서는 보안상 로컬 파일에 직접 접근 할 수 없으며, 로컬 파일 구조의 노출을 막고자 C:\fakepath\ 를 포함하여, 숨긴다.
이 경로의 브라우저마다 구현된 형태가 다를 수 있다.
https://html.spec.whatwg.org/multipage/input.html#fakepath-srsly
input.accept
input[type=file] accept 는 선택 가능한 파일 종류를 설정할 수 있다.
파일은 , 로 구분하며, 아래와 같은 형태로 작성할 수 있다.
- accept="image/*" : png 같은 이미지파일
- accept="video/*" : mp4 같은 동영상파일
- accept="audio/*" : wav 같은 오디오파일
- accept=".pdf, .doc, .csv" : pdf, doc, css 확장자 파일
input.capture
input[type=file] capture 는 모바일 같은 특정 기기에서 capture 방법을 설정할 수 있다.
- capture="camera" : 카메라
- capture="camcorder" : 동영상
- capture="microphone" : 마이크
capture 속성을 지원하지 않는 브라우저의 경우, accept="image/*;capture=camera" 으로 사용할 수도 있다.
<!--html-->
<input id="camera"
type="file"
capture="camera"
accept="image/*;capture=camera"
/>
FileList
input.files 에는 선택한 파일들을 FileList 로 가진다.
FileList 는 File 들을 가지는 객체이며, { [index]: File, length: number } 형태를 가진 array-like object 이다.
FileList[index] 혹은 FileList.item(index) 형태로 File 에 접근할 수 있다.
이 FileList 는 Symbol(Symbol.iterator) 가 정의되어 있어, 순차적으로 참조하기 위해서, for of 를 사용할 수 있다.
혹은 Array.from() 로 변환하여 참조 할 수 있다.
// javascript
function (event) {
var fileList = event.target.files;
for(const file of fileList) {
// ...
}
Array.from(fileList).forEach((file) => {
// ...
})
};
File
브라우저는 보안상 파일을 조작할 수 없다. 때문에 모든 값은 읽기 전용 이다.
File 은 아래 속성을 가질 수 있다.
- name : 파일 이름
- lastModified : 파일을 마지막으로 수정한 Unix Time
- lastModifiedDate : 파일을 마지막으로 수정한 Date 객체
- size : 파일의 크기 (Byte 값)
- type : MIME 유형
File
name: "htm_20190729104652375824.jpg"
lastModified: 1586075186723
lastModifiedDate: Sun Apr 05 2020 17:26:26 GMT+0900 (대한민국 표준시) {}
size: 54973
type: "image/jpeg"
'JS' 카테고리의 다른 글
[JS] 웹 모바일에서 App 실행 (0) | 2021.11.01 |
---|---|
[JS] IE8 및 Safari 에서 new Date() 시 NaN 오류 이슈 (0) | 2021.11.01 |
[JS] event.stopPropagation(), event.preventDefault () 이해하기 (0) | 2021.07.27 |
[JS] emailjs 이메일 보내기 (0) | 2021.07.05 |
[JS] 자바스크립트 Array forEach (0) | 2021.06.30 |