파일 업로드 File upload
파일 업로드는 하나 이상의 디바이스의 로컬 파일을 선택하고 첨부하는 데 사용하는 입력 컴포넌트이다.
기본
v-model에 파일 목록(FileInfo[])을 바인딩합니다. 컴포넌트는 파일을 서버로 보내지 않습니다. 추가된 파일은 pending 상태로 목록에 들어가므로 실제 업로드와 상태 변경은 직접 처리합니다.
타이틀영역
컨텐츠 영역
첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([])
</script>
<template>
<KrdsFileUpload v-model="files" title="타이틀영역" description="컨텐츠 영역" />
</template>파일 상태별 표시
FileInfo의 status에 따라 표시가 달라집니다. uploading은 스피너, completed는 완료 아이콘, pending은 삭제 버튼, error는 errorMessage를 표시합니다. downloadUrl이 있으면 다운로드·바로보기 버튼이 표시되고, 누르면 download·preview 이벤트가 발생합니다.
타이틀영역
컨텐츠 영역
첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.
- 위임장(주민등록법 시행령 별지 제15호의2호서식) [hwp, 17KB]업로드 중
- 위임장(주민등록법 시행령 별지 제15호의2호서식) [hwp, 17KB]업로드 완료
- 위임장(주민등록법 시행령 별지 제15호의2호서식) [hwp, 17KB]
- 전입재등록신고서 [주민등록법 시행령 별지서식 15, 15호의2호] [hwp, 25MB]
등록 가능한 파일 용량을 초과하였습니다.
20MB 미만의 파일만 등록할 수 있습니다. - 위임장(주민등록법 시행령 별지 제15호의2호서식) [hwp, 17KB]
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([
{
id: '1',
file: new File([''], '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp'),
name: '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp',
size: 17 * 1024,
type: 'application/x-hwp',
status: 'uploading'
},
{
id: '2',
file: new File([''], '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp'),
name: '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp',
size: 17 * 1024,
type: 'application/x-hwp',
status: 'completed'
},
{
id: '3',
file: new File([''], '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp'),
name: '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp',
size: 17 * 1024,
type: 'application/x-hwp',
status: 'pending'
},
{
id: '4',
file: new File([''], '전입재등록신고서 [주민등록법 시행령 별지서식 15, 15호의2호].hwp'),
name: '전입재등록신고서 [주민등록법 시행령 별지서식 15, 15호의2호].hwp',
size: 25 * 1024 * 1024,
type: 'application/x-hwp',
status: 'error',
errorMessage: '등록 가능한 파일 용량을 초과하였습니다.\n20MB 미만의 파일만 등록할 수 있습니다.'
},
{
id: '5',
file: new File([''], '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp'),
name: '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp',
size: 17 * 1024,
type: 'application/x-hwp',
status: 'completed',
downloadUrl: '/files/sample.hwp'
}
])
</script>
<template>
<KrdsFileUpload v-model="files" title="타이틀영역" description="컨텐츠 영역" />
</template>파일 선택 동작
파일선택 버튼이나 업로드 영역으로 끌어다 놓아 파일을 추가합니다. maxFileSize(기본 20MB) 이상인 파일은 error 상태로 추가되고 개수에서 빠집니다. maxFiles(기본 10개)에 이르면 더 추가되지 않습니다.
파일 업로드
파일을 선택하거나 드래그하여 업로드하세요.
첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([])
</script>
<template>
<KrdsFileUpload
v-model="files"
title="파일 업로드"
description="파일을 선택하거나 드래그하여 업로드하세요."
:max-file-size="20 * 1024 * 1024"
/>
</template>단일 파일
multiple을 false로 지정하면 새로 선택한 파일이 기존 파일을 대신합니다.
단일 파일 업로드
하나의 파일만 업로드할 수 있습니다.
첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([])
</script>
<template>
<KrdsFileUpload v-model="files" :multiple="false" title="단일 파일 업로드" description="하나의 파일만 업로드할 수 있습니다." />
</template>이미지 파일만
accept에 허용할 확장자나 MIME 타입을 지정합니다. 끌어다 놓은 파일이 형식에 맞지 않으면 error 상태로 추가됩니다.
이미지 파일 업로드
JPG, PNG, GIF 파일만 업로드할 수 있습니다.
첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([])
</script>
<template>
<KrdsFileUpload
v-model="files"
accept=".jpg,.jpeg,.png,.gif"
:max-files="5"
title="이미지 파일 업로드"
description="JPG, PNG, GIF 파일만 업로드할 수 있습니다."
/>
</template>비활성화
비활성화 상태
파일 업로드가 비활성화된 상태입니다.
첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.
- 위임장(주민등록법 시행령 별지 제15호의2호서식) [hwp, 17KB]
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([
{
id: '3',
file: new File([''], '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp'),
name: '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp',
size: 17 * 1024,
type: 'application/x-hwp',
status: 'pending'
}
])
</script>
<template>
<KrdsFileUpload v-model="files" disabled title="비활성화 상태" description="파일 업로드가 비활성화된 상태입니다." />
</template>읽기 전용
업로드 영역과 삭제 버튼 없이 파일 목록만 표시합니다.
읽기 전용
업로드된 파일만 확인할 수 있습니다.
- 위임장(주민등록법 시행령 별지 제15호의2호서식) [hwp, 17KB]
<script setup lang="ts">
import { ref } from 'vue'
import { KrdsFileUpload } from '@krds.ui/vue'
import type { FileInfo } from '@krds.ui/vue'
const files = ref<FileInfo[]>([
{
id: '5',
file: new File([''], '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp'),
name: '위임장(주민등록법 시행령 별지 제15호의2호서식).hwp',
size: 17 * 1024,
type: 'application/x-hwp',
status: 'completed',
downloadUrl: '/files/sample.hwp'
}
])
</script>
<template>
<KrdsFileUpload v-model="files" readonly title="읽기 전용" description="업로드된 파일만 확인할 수 있습니다." />
</template>KrdsFileUpload
Props
| 이름 | 타입 | 기본값 | 설명 |
|---|---|---|---|
class | KrdsClassValue | - | CSS 클래스 |
name | string | - | 폼 필드 이름 |
style | string | Record<string, any> | - | 인라인 스타일 |
title | string | '타이틀영역' | 제목 |
id | string | - | HTML ID |
required | boolean | false | 필수 입력 여부 |
disabled | boolean | false | 비활성화 여부 |
size | Size | 'medium' | 입력 크기 |
modelValue | FileInfo[] | [] | 파일 목록 |
description | string | '컨텐츠 영역' | 설명 텍스트 |
placeholder | string | '첨부할 파일을 여기에 끌어다 놓거나, 파일 선택 버튼을 눌러 파일을 직접 선택해주세요.' | 플레이스홀더 텍스트 |
readonly | boolean | false | 읽기 전용 여부 |
accept | string | - | 허용되는 파일 타입 (예: '.jpg,.png,.pdf') |
maxFiles | number | 10 | 최대 파일 개수 |
maxFileSize | number | 20 * 1024 * 1024 // 20MB
| 최대 파일 크기 (bytes) |
multiple | boolean | true | 다중 파일 선택 여부 |
dragAndDrop | boolean | true | 드래그 앤 드롭 활성화 여부 |
showPreview | boolean | true | 미리보기 표시 여부 |
showDownload | boolean | true | 다운로드 버튼 표시 여부 |
showPreviewButton | boolean | true | 바로보기 버튼 표시 여부 |
showClearAll | boolean | true | 전체 삭제 버튼 표시 여부 |
Events
| 이름 | 인자 | 설명 |
|---|---|---|
update:modelValue | [files: FileInfo[]] | 파일을 추가·삭제해 목록이 바뀔 때 (v-model) |
file-added | [file: FileInfo] | 파일을 추가했을 때 |
file-removed | [fileId: string] | 파일을 삭제했을 때 (파일 id) |
file-error | [file: FileInfo, error: string] | 추가한 파일이 검사(크기·형식 등)에 실패했을 때 (오류 메시지) |
upload-start | [file: FileInfo] | 보내지 않음 (기존 코드 호환용 선언), 업로드는 사용하는 쪽에서 처리 |
upload-progress | [file: FileInfo, progress: number] | 보내지 않음 (기존 코드 호환용 선언), 업로드는 사용하는 쪽에서 처리 |
upload-complete | [file: FileInfo] | 보내지 않음 (기존 코드 호환용 선언), 업로드는 사용하는 쪽에서 처리 |
upload-error | [file: FileInfo, error: string] | 보내지 않음 (기존 코드 호환용 선언), 업로드는 사용하는 쪽에서 처리 |
clear-all | [] | 전체 삭제 버튼을 눌렀을 때 |
download | [file: FileInfo] | 파일의 다운로드 버튼을 눌렀을 때 |
preview | [file: FileInfo] | 파일의 미리보기 버튼을 눌렀을 때 |