MenüChevron Down
FileUpload Datei-Upload - Docs - Artefact

FileUpload Datei-Upload

Forms
Intelligente Auto-Erkennung

Einführung

Eine Dropzone und Dateiauswahl zum Auswählen einer oder mehrerer Dateien, mit Drag-and-Drop, clientseitiger Validierung (Typ/Größe/Anzahl) und einer Live-Vorschauliste — alles aufgebaut aus Ark-UI-äquivalenten Teilen über einem nativen <input type="file">, sodass das Formular auch ohne JavaScript funktioniert.

Verwendung

Drag and drop or browse files
    import { FileUpload } from "../components/ui";
    
    export default function MyPage() {
      return (
        <FileUpload
          label="Upload Images"
          name="images"
          accept="image/*"
          maxFiles={2}
          dropzoneText="Drag and drop or browse files"
        />
      );
    }
    

    Benutzerdefinierte Zusammensetzung

    Die Standardzusammensetzung (Props label + dropzoneText + triggerText) deckt den häufigen Fall ab. Übergeben Sie explizite children für volle Kontrolle über das Layout — tauschen Sie eine beliebige Teilmenge der untenstehenden Teile ein:

    import { FileUpload } from "../components/ui";
    
    export default function MyPage() {
      return (
        <FileUpload name="attachments" maxFiles={5} accept="image/*,.pdf">
          <FileUpload.Label>Attachments</FileUpload.Label>
          <FileUpload.Dropzone>
            <span>Drop files here, or</span>
            <FileUpload.Trigger>browse</FileUpload.Trigger>
          </FileUpload.Dropzone>
          <FileUpload.List showSize clearable />
          <FileUpload.ClearTrigger>Clear all</FileUpload.ClearTrigger>
          <FileUpload.HiddenInput />
        </FileUpload>
      );
    }
    

    CMS-Seitenbauer

    Diese Komponente ist als file-upload (Alias fileUpload)-Block im Seitenbauer (content/pages/*.json) verfügbar:

    {
      "type": "file-upload",
      "label": "Resume",
      "name": "resume",
      "accept": ".pdf,.docx",
      "maxFiles": 1,
      "maxFileSize": 5242880,
      "dropzoneText": "Drag your file(s) here",
      "triggerText": "Open file picker",
      "showSize": true,
      "clearable": true
    }
    

    maxFiles und maxFileSize werden vom Renderer aus Zeichenketten in Zahlen umgewandelt; jedes andere Feld wird direkt an FileUpload durchgereicht. Im Seitenbauer wird sie immer interactive gerendert.

    Eigenschaften

    Wurzel

    EigenschaftTypBeschreibung
    acceptstring | string[] | Record<string, string[]>Akzeptierte Dateitypen — eine MIME-Zeichenkette, eine Liste oder ein MIME→Erweiterungen-Datensatz. Normalisiert auf das native accept-Attribut.
    allowDropbooleanOb Drag-and-Drop in der Dropzone erlaubt ist. Standard true.
    capture"user" | "environment"Die Standardkamera für die Medienaufnahme.
    directorybooleanOb Verzeichnisse akzeptiert werden (webkitdirectory).
    disabledbooleanDeaktiviert die Dropzone, den Auslöser und die versteckte Eingabe.
    invalidbooleanMarkiert das Feld als ungültig (data-invalid auf jedem Teil).
    requiredbooleanMarkiert die zugrunde liegende Eingabe als erforderlich.
    maxFilesnumberMaximale Anzahl an Dateien. Standard 1. Bei Auswahl von > 1 wechselt die Insel vom Ersetzen- in den Anhänge-Modus.
    maxFileSizenumberMaximale Dateigröße in Bytes. Standard Infinity.
    minFileSizenumberMinimale Dateigröße in Bytes. Standard 0.
    namestringName der zugrunde liegenden Dateieingabe, für die native Formularübermittlung.
    localestringBCP-47-Locale für die Dateigrößenformatierung. Standard "en-US".
    translationsPartial<FileUploadTranslations>Überschreibungen für die ARIA-Zeichenketten von Dropzone/Vorschau/löschen/leeren.
    size"sm" | "md" | "lg"Visuelle Größenvariante. Standard "md".
    acceptedFilesFile[]Gesteuerte Liste akzeptierter Dateien (nur Insel).
    defaultAcceptedFilesFile[]Anfängliche Liste akzeptierter Dateien, ungesteuert (nur Insel).
    preventDocumentDropbooleanVerhindert, dass der Browser zu einer außerhalb der Dropzone abgelegten Datei navigiert. Standard true (nur Insel).
    validate(file: File, details: FileValidateDetails) => FileError[] | nullBenutzerdefinierte Validierung, ausgeführt nach den eingebauten Typ/Größe/Anzahl-Prüfungen (nur Insel).
    transformFiles(files: File[]) => Promise<File[]>Wandelt neu akzeptierte Dateien (z. B. komprimieren) um, bevor sie übernommen werden (nur Insel).
    onFileAccept(details: FileAcceptDetails) => voidWird mit den aus der letzten Auswahl oder Ablage akzeptierten Dateien aufgerufen.
    onFileReject(details: FileRejectDetails) => voidWird mit etwaigen abgelehnten Dateien und deren Fehlercodes aufgerufen.
    onFileChange(details: FileChangeDetails) => voidWird nach jeder Auswahl mit den vollständigen akzeptierten/abgelehnten Mengen aufgerufen.
    interactivebooleanErzwingt (oder unterdrückt) die Hydration als Insel.

    Standardzusammensetzung

    Diese Props gelten nur, wenn children weggelassen wird — FileUpload rendert dann Label + Dropzone + Trigger + List + HiddenInput für Sie.

    EigenschaftTypBeschreibung
    labelstringBeschriftung über der Dropzone.
    dropzoneTextstringHilfetext der Dropzone. Standard "Drag your file(s) here".
    triggerTextstringText der Auslöser-Schaltfläche. Standard "Open file picker".
    showSizebooleanZeigt die formatierte Größe jeder Datei in der Liste. Standard true.
    clearablebooleanZeigt einen dateiweisen Löschen-Auslöser in der Liste. Standard true.

    Unterkomponenten

    FileUpload ist eine zusammengesetzte Komponente — jedes der untenstehenden Teile liest aus dem FileUpload.Root-Kontext, funktioniert also nur verschachtelt innerhalb davon (bzw. innerhalb eines FileUpload.Item für die item-bezogenen Teile).

    TeilBeschreibung
    FileUpload.Label<label>, das über for an die versteckte Eingabe gebunden ist.
    FileUpload.DropzoneAblegeziel; rendert role="button" mit Tastaturunterstützung (Enter/Leertaste öffnet die Auswahl).
    FileUpload.TriggerÖffnet die Dateiauswahl. Wird als <label for> gerendert (nicht als <button>), sodass es auch ohne JavaScript funktioniert.
    FileUpload.HiddenInputDie visuell versteckte native <input type="file">, die die Auswahl für die Formularübermittlung tatsächlich hält.
    FileUpload.ItemGroup<ul>, das die akzeptierten Items umschließt.
    FileUpload.ItemEine akzeptierte Datei. Benötigt eine file-Prop; stellt den Datei-Kontext für seine Kinder bereit.
    FileUpload.ItemNameDer Name der Datei bzw. children zur Überschreibung.
    FileUpload.ItemSizeTextDie formatierte Größe der Datei (über formatBytes) bzw. children zur Überschreibung.
    FileUpload.ItemPreviewWrapper, der nur angezeigt wird, wenn der MIME-Typ der Datei ihrem type-Regex (Standard ".*") entspricht.
    FileUpload.ItemPreviewImageClient-seitiges <img>-Vorschaubild über URL.createObjectURL; rendert während SSR oder für Nicht-Bild-Dateien nichts.
    FileUpload.ItemDeleteTriggerEntfernt diesen Eintrag aus der Liste akzeptierter Dateien.
    FileUpload.ClearTriggerLeert alle akzeptierten Dateien. Automatisch ausgeblendet, wenn die Liste leer ist.
    FileUpload.ItemsZusammengesetzt: bildet akzeptierte Dateien auf Items mit Bild/Dateisymbol-Vorschau, Name, optionaler Größe und optionalem Löschen-Auslöser ab. Nimmt showSize / clearable / files.
    FileUpload.ListZusammengesetzt: ItemGroup, das Items umschließt. Dieselben Props showSize / clearable / files.
    FileUpload.FileTextZeigt den Namen der ersten ausgewählten Datei, eine „N files“-Anzahl bei Mehrfachauswahl oder eine fallback-Zeichenkette, wenn nichts ausgewählt ist.
    import { FileUpload, formatBytes } from "../components/ui";
    

    formatBytes(bytes, locale?) sowie die Typen FileAccept / FileError / FileRejection / FileChangeDetails / FileUploadTranslations werden ebenfalls für Konsumenten exportiert, die eine vollständig benutzerdefinierte Zusammensetzung bauen.

    Validierung

    Jede ausgewählte Datei wird der Reihe nach geprüft und bei der ersten fehlschlagenden Regel abgelehnt; validate läuft zuletzt, nachdem jede eingebaute Prüfung bestanden ist:

    FileError-CodeAuslöser
    FILE_INVALID_TYPEEntspricht nicht accept.
    FILE_TOO_LARGEfile.size > maxFileSize.
    FILE_TOO_SMALLfile.size < minFileSize.
    FILE_EXISTSGleicher Name/Größe/Typ bereits akzeptiert (nur Mehrfachdatei-Modus).
    TOO_MANY_FILESDas Akzeptieren dieser Datei würde maxFiles überschreiten.
    FILE_INVALIDReserviert für benutzerdefinierte validate-Ergebnisse.

    Bei maxFiles={1} (der Standard) ersetzt eine neu akzeptierte Datei die aktuelle Auswahl. Bei maxFiles > 1 werden neue Dateien bis zum Limit an die bestehende Auswahl angehängt.

    Barrierefreiheit

    • Dropzone rendert role="button" mit aria-label aus translations.dropzone, aria-disabled bei Deaktivierung, und ist per Tastatur bedienbar (tabIndex={0}, Enter/Leertaste öffnet die Dateiauswahl).
    • Label und Trigger sind echte <label for>-Elemente, die an die id der versteckten Eingabe gebunden sind, sodass ein Klick auf eines die native Dateiauswahl auch vor der Hydration öffnet.
    • ItemDeleteTrigger und ClearTrigger erhalten aria-labels aus translations.deleteFile(file) / translations.clearFiles, überschreibbar über die Prop translations.
    • data-disabled / data-invalid / data-required / data-readonly / data-dragging werden für Styling und assistive-Technik-Zustand auf jedem Teil gespiegelt.