ImageUpload
이미지 전용 업로드 컴포넌트. 드래그 앤 드롭 또는 클릭으로 이미지를 업로드하고, 썸네일 그리드로 관리한다.
개요
Foundation의 FileUpload 컴포넌트를 래핑하여 이미지 전용 업로드 기능을 제공한다. 이미지 확장자만 허용하며, 썸네일 미리보기·회전·미리보기 팝업 등 이미지 관리에 특화된 기능을 제공한다.
주요 특징
- ✅ 이미지 전용: JPG, PNG, GIF만 허용 (확장자 자동 검증)
- ✅ 썸네일 그리드: 업로드된 이미지를 그리드 형태로 미리보기
- ✅ 이미지 회전: 새 파일은 시계방향 90° 회전 지원
- ✅ 미리보기 팝업: 썸네일 클릭 시 원본 이미지 확대 보기
- ✅ 파일 검증: 확장자, 크기, 개수, 빈 파일 검사
- ✅ 읽기 전용: 업로드·삭제·회전 숨김, 다운로드·미리보기 유지
- ✅ FormItem 통합: 레이블, 필수 표시, 수평 배치, 도움말 지원
기본 사용
드래그 앤 드롭 또는 클릭으로 이미지를 업로드한다. 이미지 파일만 허용된다.
Preview
0 files / -
0 file / -
Drop file or Click to upload
기존 이미지 목록
서버에 저장된 기존 이미지를 썸네일 그리드로 표시한다. 새 파일(isNew)에는 회전 버튼, 기존 파일에는 다운로드 버튼이 표시된다.
Preview
2 files / 2.44 MB
photo.jpg
1.95 MB
logo.png
500 KB
읽기 전용
readOnly이면 업로드 영역·삭제·회전 버튼이 숨겨진다.
Preview
1 files / 1.95 MB
photo.jpg
1.95 MB
파일 검증
maxFileSize와 maxFileCount로 업로드 규칙을 설정한다.
Preview
0 files / -
0 file / -
Drop file or Click to upload
레이블 / 필수
FormItem 래핑으로 레이블, 필수 표시, 수평 레이아웃을 지원한다.
Preview
0 files / -
0 file / -
Drop file or Click to upload
0 files / -
0 file / -
Drop file or Click to upload
0 files / -
0 file / -
Drop file or Click to upload
라벨 도움말
labelTooltip으로 레이블 옆에 도움말 아이콘을 표시한다.
Preview
0 files / -
0 file / -
Drop file or Click to upload
API Reference
Props
| Prop | Type | Default | Description |
|---|---|---|---|
value | File[] | - | 새로 추가된 파일 (controlled) |
onChange | (files: File[]) => void | - | 파일 변경 콜백 |
existingFiles | ImageFile[] | - | 서버 저장 기존 이미지 목록 |
onRemoveExisting | (file: ImageFile) => void | - | 기존 파일 삭제 콜백 |
accept | string | "image/jpeg,image/png,image/gif" | 허용 MIME 타입 |
maxFileSize | number | 5 | 최대 파일 크기 (MB) |
maxFileCount | number | 5 | 최대 파일 수 |
multiple | boolean | true | 다중 파일 선택 |
readOnly | boolean | - | 읽기 전용 |
visible | boolean | true | 표시 여부 |
rejectEmptyFile | boolean | true | 빈 파일 차단 |
height | number | string | - | 컴포넌트 높이 |
color | string | - | 글자색 (토큰 오버라이드) |
backgroundColor | string | - | 배경색 (토큰 오버라이드) |
borderColor | string | - | 테두리색 (토큰 오버라이드) |
label | ReactNode | - | 레이블 텍스트 |
showLabel | boolean | - | 빈 레이블 공간 표시 |
labelTooltip | string | - | 레이블 도움말 |
required | boolean | - | 필수 입력 |
orientation | "vertical" | "horizontal" | - | 레이블 위치 |
className | string | - | 컨테이너 CSS 클래스 |
formClassName | string | - | FormItem 래퍼 CSS 클래스 |
Events
| Event | Type | Description |
|---|---|---|
onChange | (files: File[]) => void | 파일 변경 시 호출 |
onError | (error: string) => void | 에러 발생 시 호출 |
onRemoveExisting | (file: ImageFile) => void | 기존 파일 삭제 시 호출 |
onDownload | (file: ImageFile) => void | 파일 다운로드 시 호출 |
onResolvePreviewUrl | (file: ImageFile) => Promise<string> | 서버 파일 미리보기 URL 변환 |
onRotate | (file: ImageFile, angle: number) => void | 이미지 회전 시 호출 |
Ref API
| Method | Type | Description |
|---|---|---|
focus() | () => void | 드롭존 포커스 이동 |
blur() | () => void | 포커스 해제 |
element | HTMLElement | 컨테이너 DOM 요소 |
접근성
권장 사항
- ✅
labelprop으로 업로드 영역에 의미 있는 레이블 제공 - ✅
required설정 시aria-required자동 적용 - ✅ 미리보기 팝업 Dialog에
aria-label적용 - ✅ 모든 액션 버튼에
aria-label적용 (회전, 다운로드, 삭제) - ❌ 아이콘만 있는 버튼에
aria-label누락 금지
관련 컴포넌트
- FileUpload: 범용 파일 업로드 컴포넌트
- Foundation FileUpload: 기본 FileUpload 컴포넌트
- FormItem: 폼 래퍼
Last updated on