File upload
패키지 네임스페이스가 아니라 레시피입니다. 컨트롤은 네이티브 <input type="file">이고, useDropzone이 드래그 앤 드롭과 파일 확인을 더하며, 업로드는 직접 작성하는 코드가 맡습니다. FileUpload.* export는 없습니다.
이미지
라벨이 드롭 대상입니다. 그래서 라벨 어디를 클릭해도 선택기가 열리고, 라벨의 텍스트가 입력의 이름이 됩니다. 거부된 파일은 입력의 aria-describedby가 가리키는 ErrorMessage에 나열하고, 입력에는 aria-invalid를 줍니다. 받은 파일은 그 아래에 나열합니다.
const zone = useDropzone({
accept: 'image/*',
multiple: true,
maxFiles: 3,
maxSize: 2_000_000,
minSize: 1,
onFiles: (accepted, rejected) => {
setFiles(accepted)
setRejected(rejected)
},
})
<label {...zone.getRootProps()}>
<Text as="span">Drop images here, or choose them</Text>
<input
{...zone.getInputProps()}
name="images"
aria-invalid={rejected.length > 0 || undefined}
aria-describedby={rejected.length > 0 ? `${hintId} ${errorId}` : hintId}
/>
</label>
<Description id={hintId}>Up to 3 images, 2 MB each.</Description>
{rejected.length > 0 ? <ErrorMessage id={errorId}>…</ErrorMessage> : null}
Up to 3 images, 2 MB each.
드롭 상태는 [data-dragging]이나 dragging 값으로 스타일을 주세요. 오류는 나타날 때 읽어 주지 않습니다. 읽어 주어야 한다면 useAnnouncer를 쓰세요.
업로드
onFiles에서 파일을 보내거나, 입력에 남겨 두고 폼이 제출하게 하세요. 입력에는 받은 파일만 남아 있습니다. 진행률은 Progress 페이지처럼 네이티브 <progress>로 보여 주세요.