Skip to content
shadcn.io
shadcn.io is not affiliated with official shadcn/ui

Shadcn File Upload for React and Tailwind

A component that allows users to upload files.

Drop files here
or
You can upload up to 2 files at a time.

Installation

bunx --bun shadcn@latest add https://kit.dev/r/file-upload.json

Anatomy

FileUpload
├── FileUploadTrigger
├── FileUploadDropzone
│   ├── FileUploadDropzoneIcon
│   ├── FileUploadTitle
│   ├── FileUploadDescription
│   └── FileUploadHelper
├── FileUploadItemGroup
│   └── FileUploadList
│       └── FileUploadItem
│           ├── FileUploadItemPreview
│           │   └── FileUploadItemPreviewImage
│           ├── FileUploadItemName
│           ├── FileUploadItemSize
│           └── FileUploadItemDeleteTrigger
└── FileUploadClearTrigger

Usage

import { 
  FileUpload,
  FileUploadDropzone,
  FileUploadDropzoneIcon,
  FileUploadTitle,
  FileUploadDescription,
  FileUploadHelper,
  FileUploadTrigger,
  FileUploadList,
} from "@/components/ui/file-upload";
<FileUpload maxFiles={2} accept={["image/*png,image/jpeg*", ".pdf"]}>
  <FileUploadDropzone>
    <FileUploadDropzoneIcon />
    <FileUploadTitle>Drop files here</FileUploadTitle>
    <FileUploadDescription>or</FileUploadDescription>
    <FileUploadTrigger />
    <FileUploadHelper>You can upload up to 2 files at a time.</FileUploadHelper>
  </FileUploadDropzone>
  <FileUploadList />
</FileUpload>

Examples

Multiple Files

Use the maxFiles prop to allow uploading multiple files at once.

Trigger only

Dropzone only

Use FileUploadDropzone to enable drag-and-drop. It exposes a data-dragging attribute for styling the drag state.

Accepted Files

Use the accept prop to restrict file types.

With Field

Use Field to add helper text and error handling.

Custom Preview

const { acceptedFiles } = useFileUploadContext();

return (
  <div>
    {acceptedFiles.map((file) => (
      <div key={file.name}>{file.name}</div>
    ))}
  </div>
);

Media Capture

Use the capture prop to capture and upload media directly from the device camera.

Directory Upload

Use the directory prop to upload entire folders.

Clear Trigger

Use FileUploadClearTrigger to remove all uploaded files at once.

Custom spacing

Use [--space:--spacing("value")] on FileUploadDropzone to adjust internal spacing.

Default spacing is --spacing(6).

You can use breakpoint utilities to change the internal spacing at different screen sizes.

  md:[--space:--spacing(6)] lg:[--space:--spacing(8)]

API Reference

FileUpload

Root component. Manages file state and wraps the upload UI.

PropTypeDefault
acceptstring | Record<string, string[]> | FileMimeType[]-
acceptedFilesFile[]-
allowDropbooleantrue
capture"user" | "environment"-
defaultAcceptedFilesFile[]-
directorybooleanfalse
disabledboolean-
invalidboolean-
maxFilesnumber1
maxFileSizenumberInfinity
minFileSizenumber0
namestring-
onFileAccept(details: FileAcceptDetails) => void-
onFileChange(details: FileChangeDetails) => void-
onFileReject(details: FileRejectDetails) => void-
readOnlyboolean-
requiredboolean-
transformFiles(files: File[]) => Promise<File[]>-
validate(file: File, details: FileValidateDetails) => FileError[] | null-
classNamestring-

FileUploadTrigger

Opens the native file picker on click.

PropTypeDefault
asChildboolean-
classNamestring-

FileUploadDropzone

Drop zone for drag-and-drop. Exposes data-dragging when files are dragged over.

PropTypeDefault
asChildboolean-
disableClickboolean-
classNamestring-
AttributeDefault
--space--spacing(8)

FileUploadDropzoneIcon

Icon shown in the dropzone.

PropTypeDefault
classNamestring-

FileUploadTitle

Title text for the dropzone.

PropTypeDefault
classNamestring-

FileUploadDescription

Description or hint for the dropzone.

PropTypeDefault
classNamestring-

FileUploadHelper

Small text that provides additional information about the dropzone.

PropTypeDefault
classNamestring-

FileUploadList

List of uploaded files. Hidden when empty.

PropTypeDefault
classNamestring-

FileUploadItemGroup

List of uploaded files.

PropTypeDefault
asChildboolean-
type"accepted" | "rejected"-
classNamestring-

FileUploadItem

Single uploaded file with preview and remove button.

PropTypeDefault
fileFilerequired
asChildboolean-
classNamestring-

FileUploadItemPreview

Preview container for a file.

PropTypeDefault
asChildboolean-
typestring'.*'
classNamestring-

FileUploadItemPreviewImage

Image thumbnail for image files. Use inside FileUploadItemPreview with type="image/*".

PropTypeDefault
asChildboolean-
classNamestring-

FileUploadItemName

Shows the file name.

PropTypeDefault
asChildboolean-
classNamestring-

FileUploadItemSize

Shows the formatted file size.

PropTypeDefault
asChildboolean-
classNamestring-

FileUploadItemDeleteTrigger

Removes a single file from the list.

PropTypeDefault
asChildboolean-
classNamestring-

FileUploadClearTrigger

Removes all files from the list.

PropTypeDefault
asChildboolean-
classNamestring-

useFileUploadContext

Hook to access file upload state and methods. Use inside FileUpload or FileUploadRootProvider.

PropertyType
acceptedFilesFile[]
rejectedFilesFileRejection[]
openFilePicker() => void
deleteFile(file: File, type?: ItemType) => void
clearFiles() => void
clearRejectedFiles() => void
getFileSize(file: File) => string
createFileUrl(file: File, cb: (url: string) => void) => () => void
setClipboardFiles(dt: DataTransfer) => boolean

For a complete list of props, see the Ark UI documentation.