File Uploadv1.0.0

ناحیهٔ کشیدن‌ورهاکردن برای بارگذاری فایل، با فهرست فایل‌های انتخاب‌شده، دکمهٔ حذف هر فایل و کنترل نوع، حجم و تعداد. زیرش همان input بومی فایل است، پس کلیک، صفحه‌کلید و ارسال فرم رفتار مرورگر را دارند.

ری‌اکت ۱۹ و Next.js با پیاده‌سازی دسترس‌پذیری داخلی دیگویو ۳ با Composition API — هنوز برای این کامپوننت پورت نشدهSvelte ۵ با runes — هنوز برای این کامپوننت پورت نشدهانگولار با signals و دایرکتیوهای standalone — هنوز برای این کامپوننت پورت نشده

این کامپوننت فعلاً برای ۱ فریم‌ورک از ۴ فریم‌ورک آماده است.

این نمونه هنوز برای Vue پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

این نمونه هنوز برای Svelte پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

این نمونه هنوز برای Angular پورت نشده است؛ آنچه می‌بینید نسخهٔ ری‌اکت است.

نصب

با CLI اختصاصی digdesign کامپوننت را از رجیستری دیگ نصب کنید؛ وابستگی‌ها و فایل‌ها خودکار اضافه می‌شوند.

پکیج‌منیجر پیش‌فرض Node.jsنصب سریع با لینک سخت و دیسک مشترکYarn نسخهٔ ۲ به بالا (Berry)رانتایم و پکیج‌منیجر Bun
npx digdesign@latest add https://docs.digdesign.ir/r/file-upload.json
pnpm dlx digdesign@latest add https://docs.digdesign.ir/r/file-upload.json
yarn dlx digdesign@latest add https://docs.digdesign.ir/r/file-upload.json
bunx --bun digdesign@latest add https://docs.digdesign.ir/r/file-upload.json

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

استفاده

import { FileUpload } from "@/components/ui/file-upload"

<FileUpload name="document" accept="image/*,.pdf" />

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

ترکیب اجزا

ناحیهٔ رهاکردن یک label برای input بومی type="file" است که از دید پنهان ولی در DOM است. پس کلیک یا Enter همان پنجرهٔ انتخاب فایل سیستم‌عامل را باز می‌کند و فوکوس صفحه‌کلید روی خود ناحیه حلقهٔ فوکوس می‌گیرد.

فایل‌های رهاشده یا انتخاب‌شده با accept، maxSize و maxFiles سنجیده می‌شوند؛ ردشده‌ها با دلیل فارسی زیر ناحیه فهرست می‌شوند و onReject هم صدا زده می‌شود. فهرست فایل‌ها همیشه با input بومی هم‌گام است، پس با name فایل‌ها با submit معمولی فرم هم می‌روند.

دسترس‌پذیری

  • ناحیهٔ رهاکردن label یک input فایل واقعی است؛ صفحه‌خوان آن را به‌عنوان دکمهٔ انتخاب فایل با همان متن ناحیه می‌خواند.
  • کشیدن‌ورهاکردن فقط یک میان‌بر است؛ همهٔ کارها با کلیک و صفحه‌کلید هم ممکن است.
  • هر فایل در فهرست یک دکمهٔ حذف با برچسب «حذف نام‌فایل» دارد و بعد از حذف فوکوس به ناحیهٔ انتخاب برمی‌گردد.
  • فایل در حال بارگذاری aria-busy دارد و نوار پیشرفتش برچسب «بارگذاری نام‌فایل» می‌گیرد؛ تامنیل تصویر alt برابر نام فایل دارد.
  • پیام فایل‌های ردشده در یک ناحیهٔ aria-live است و با aria-describedby به input وصل می‌شود.

مرجع API

FileUpload

ویژگینوعپیش‌فرضتوضیح
acceptstring—همان accept بومی؛ مثل "image/*,.pdf".
multiplebooleanfalseانتخاب چند فایل.
maxSizenumber—بیشینهٔ حجم هر فایل به بایت.
maxFilesnumber—بیشینهٔ تعداد فایل‌ها (فقط با multiple).
filesFile[]—فهرست کنترل‌شدهٔ فایل‌ها.
onFilesChange(files: File[]) => void—با هر افزودن یا حذف فایل صدا زده می‌شود.
onReject(rejections: { file: File; reason: string }[]) => void—فایل‌های ردشده با دلیل فارسی.
namestring—نام فیلد؛ فایل‌ها با submit معمولی و FormData ارسال می‌شوند.
titleReact.ReactNode—متن اصلی ناحیهٔ رهاکردن؛ پیش‌فرض «برای انتخاب کلیک کنید یا فایل را این‌جا بکشید» و هنگام کشیدن فایل «فایل را این‌جا رها کنید».
hintReact.ReactNode—خط راهنمای نوع و حجم مجاز.
requiredboolean—تا وقتی فهرست خالی است ارسال فرم متوقف می‌شود.
invalidbooleanfalseحاشیهٔ خطا.
disabledbooleanfalseغیرفعال با رنگ غیرفعال.
removeLabel(file: File) => string—برچسب دکمهٔ حذف هر فایل؛ پیش‌فرض «حذف نام‌فایل».
onUpload(file, { onProgress, signal }) => Promise<void>—بارگذاری هر فایل پذیرفته‌شده؛ فهرست پیشرفت و درصد، بعد تیک یا خطا با «تلاش دوباره» نشان می‌دهد. حذف فایل signal را abort می‌کند.
layout"list" | "grid""list"ردیف با تامنیل کوچک، یا کارت با تامنیل بزرگ برای تصویر.

این کامپوننت هنوز برای Vue پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

این کامپوننت هنوز برای Svelte پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.

این کامپوننت هنوز برای Angular پورت نشده است.

نسخهٔ ری‌اکت آماده است؛ پورت این فریم‌ورک در دست کار است.