Forms

FileUpload

Componente upload file con selezione tramite click o drag-and-drop, validazione dimensione e tipo, preview immagini e gestione lista file selezionati.

Import

import { FileUpload } from '@pzeta/vue-components'

Esempio Base

<script setup lang="ts">
import { FileUpload } from '@pzeta/vue-components'
import type { FileUploadSelectEvent } from '@pzeta/vue-components'

function onSelect(event: FileUploadSelectEvent) {
  console.log('File selezionati:', event.files)
}
</script>

<template>
  <FileUpload label="Carica file" accept="*" @select="onSelect" />
</template>

Il componente gestisce solo la selezione lato client. Il caricamento effettivo verso il server va implementato nell'handler dell'evento select. La validazione del tipo MIME lato server e sempre necessaria.

Props

PropTipoDefaultDescrizione
labelstringLabel del componente
acceptstringTipi MIME accettati (es. "image/*", ".pdf,.doc") — solo validazione client-side
multiplebooleanfalsePermette selezione di piu file
maxFileSizenumberDimensione massima per file in bytes
maxFilesnumberNumero massimo di file selezionabili
disabledbooleanfalseDisabilita il componente
invalidbooleanfalseForza stato errore
requiredbooleanfalseCampo obbligatorio
showPreviewbooleanfalseMostra anteprima per file immagine
dragDropbooleanfalseAbilita area drag-and-drop
loadingbooleanfalseMostra indicatore di caricamento
loadingIconstringconfigClasse icona loading spinner
helperTextstring | nullnullTesto di aiuto
errorstring | nullnullMessaggio di errore
inputIdstringID dell'elemento input file
namestringNome del campo per form submission
classstring''Classe CSS aggiuntiva

Emits

EventoPayloadDescrizione
selectFileUploadSelectEventFile selezionati (click o drop)
removeFileUploadRemoveEventFile rimosso dalla lista
clearTutti i file rimossi

Tipi Correlati

interface FileUploadFile extends File {
  objectURL?: string  // URL temporaneo per preview
}

interface FileUploadSelectEvent {
  originalEvent: Event
  files: FileUploadFile[]
}

interface FileUploadRemoveEvent {
  file: FileUploadFile
  index: number
  files: FileUploadFile[]  // file rimanenti dopo la rimozione
}

Esempi

Upload multiplo con limite dimensione

Drag and drop con preview immagini

Integrazione con upload server

<script setup lang="ts">
import type { FileUploadSelectEvent } from '@pzeta/vue-components'

const loading = ref(false)
const error = ref<string | null>(null)

async function handleSelect(event: FileUploadSelectEvent) {
  loading.value = true
  error.value = null

  try {
    const formData = new FormData()
    for (const file of event.files) {
      formData.append('files', file)
    }
    await fetch('/api/upload', { method: 'POST', body: formData })
  } catch (e) {
    error.value = 'Errore durante il caricamento'
  } finally {
    loading.value = false
  }
}
</script>

<template>
  <FileUpload
    label="Upload"
    accept="*"
    multiple
    :loading="loading"
    :error="error"
    @select="handleSelect"
  />
</template>

Solo stati (disabled/loading/errore)

Sicurezza

La validazione accept e maxFileSize e solo client-side e puo essere aggirata. Validare sempre tipo MIME e dimensione lato server prima di processare i file.

Accessibilita

  • Il pulsante di selezione apre il file picker nativo del browser
  • L'area drag-drop ha gli handler corretti per dragover/drop
  • Il pulsante di rimozione singolo file e accessibile da tastiera

TypeScript

import type {
  FileUploadProps,
  FileUploadFile,
  FileUploadSelectEvent,
  FileUploadRemoveEvent,
} from '@pzeta/vue-components'

function onSelect(event: FileUploadSelectEvent) {
  for (const file of event.files) {
    console.log(file.name, file.size, file.objectURL)
  }
}

function onRemove(event: FileUploadRemoveEvent) {
  console.log('Rimosso:', event.file.name, 'Rimasti:', event.files.length)
}