input 태그에서 제공해주는 여러 이벤트 중 file 유형을 알아보자.
웹페이지에서 로컬 파일을 업로드 할 때 사용하며, 하나 혹은 여러 개를 선택할 수 있다. accept, value 등의 프로퍼티들을 제공하며 정의한 속성 값에 따라 상이하게 동작하는데 이때 업로드 된 파일은 서버로 전달하거나 화면에서 조작하는 등, 작업을 수행하면 된다.
먼저 코드를 살펴보자
//excel.vue
<template>
<input
id="fileUpload"
ref="inputFileRef"
type="file"
hidden
accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
@change="extractExcelData"
/>
<button @click="selectFile"> 엑셀 업로드 <button/>
</template>
<script setup>
import {reactive} from 'vue'
const inputFileRef = ref(null)
const state = reactvie({
excelList : [],
})
const selectFile = () => {
//파일 선택 시마다 value값 초기화 -> 이전 파일과 동일해도 FileReader가 데이터 읽어오도록
inputFileRef.value.value = ''
inputFileRef.value.click()
}
</script>
** input, change 이벤트 모두 사용자가 엘리먼트의 value 속성을 변경할 때 발생하고, input 이벤트와 달리 change이벤트는 value 값을 각각 변경해주지 않아도 트리거가 된다.
다만, input type="file"일 때 파일명이 동일하다면, 이전에 선택한 파일과 새로 선택한 파일의 내용이 다르더라도 value값에 할당되는 로컬 경로는 일치하기 때문에 input 및 change 이벤트는 발생하지 않는다. 따라서 value 값을 reset 해줘야 한다.
이때 같은 파일을 입력/선택 해도 이벤트에 트리거가 작동하게 된다.