Saltar al contenido
EspañolEnglish
Todos los componentes (204)

Subida con progreso

Gestión · Uploader · .amset-uploader

Qué es y cuándo usarlo

Subir ficheros de verdad, en cuanto se eligen: la zona de FileUpload para soltarlos o elegirlos y, debajo, una fila por fichero con su barra de avance, el motivo si falla, un botón para reintentar y otro para quitarlo, que cancela la subida. Es FileUpload + FileList + useFileUploads, ya montados juntos.

Cuándo usarlo

  • Adjuntos que se suben al elegirlos: facturas, justificantes, las fotos de un producto.
  • http sube por HTTP, con un formulario multipart: action (la dirección, o una función que la calcula para cada fichero), method (POST por defecto, o PUT), headers, data (campos extra que viajan con el fichero), fieldName (file por defecto) y withCredentials. Va con XMLHttpRequest y no con fetch porque fetch no dice cuánto ha salido, y sin eso la barra no se movería.
  • customRequest sube por donde diga quien lo usa (una URL firmada, el SDK de un almacenamiento) y manda sobre http: recibe { file, onProgress, signal }, llama a onProgress con el porcentaje y devuelve una promesa con lo que contesta el servidor. Tiene que respetar signal, que se cancela al quitar el fichero.
  • concurrency es cuántos suben a la vez (3 por defecto): el resto espera su turno, y uno que falla no tumba a los demás.
  • onChange avisa con la lista entera a cada cambio; onUploaded y onFailed, de cada fichero que termina o falla (lo que contestó el servidor llega en su response); onReject, de lo que no pasa el filtro de tipo, de tamaño o de cuántos caben.
  • La zona es la de FileUpload, con sus mismas props: label, hint, error, acceptedTypes, maxSizeMb, multiple, maxCount, directory, size y disabled. Sin multiple, elegir otro fichero reemplaza al anterior y cancela su subida.
  • El filtro de tipo y tamaño es comodidad: el servidor tiene que volver a comprobarlo.

Cuándo no

  • Elegir ficheros que viajan con el formulario al enviarlo, sin subirlos antes: FileUpload.
  • Subir al pulsar «Enviar» y no al elegir: useFileUploads con autoStart: false y su start(), con FileUpload (hideList) y FileList pintados por tu cuenta.
  • Enseñar adjuntos que ya están subidos: FileList.

Teclado: el de FileUpload: Tab llega a la zona y a su botón (Intro o Espacio abren el selector del sistema; con el foco en la zona se pueden pegar ficheros), y después a los botones de cada fila: «Reintentar» si ha fallado y «Quitar». Al quitar uno, el foco pasa a la lista, que dice cuántos quedan; al quitar el último, la lista desaparece y el foco vuelve al botón de elegir, con el aviso «factura.pdf quitado. No queda ninguno».

Accesibilidad: la lista es una región que se llama como la zona («Subidas de Facturas»). Mientras un fichero sube, su fila lleva una barra de progreso con nombre («Subiendo factura.pdf»); en cola no lleva barra, porque «0 %» diría que ya ha empezado. Cada cambio de estado se anuncia una sola vez en una región status —«factura.pdf subido», «No se ha podido subir falla.pdf: 413 Payload Too Large»—, y varios que terminan a la vez se anuncian juntos; el avance se ve en la barra, sin anunciarse cien veces. Los botones dicen de qué fichero son («Quitar factura.pdf»). Los errores de red, de tiempo y de estado que escribe http salen en el idioma de http.locale (castellano, por defecto).

Aspecto fino: --amset-uploader-gap, la separación entre la zona y la lista; la zona, con las --amset-upload-* de FileUpload, y la lista, con las --amset-files-* de FileList.

Cómo se ve

Facturas
Arrastra los ficheros aquí

PDF de hasta 10 MB. Prueba con un fichero llamado «falla.pdf».

<Uploader
  label="Facturas"
  hint="PDF de hasta 10 MB"
  acceptedTypes={['application/pdf']}
  maxSizeMb={10}
  multiple
  maxCount={5}
  http={{ action: '/api/facturas' }}
/>

Props

Se importa con import { Uploader } from '@amset/ui'. Las obligatorias van marcadas.

PropTipoPara qué sirve
labelobligatoriastringLo que se sube. Es el nombre de la zona de soltar y de la lista de lo elegido.
acceptedTypesreadonly string[]Tipos MIME o extensiones: `['application/pdf', '.csv']`.
classNamestringSe une a las clases de la biblioteca, no las sustituye.
concurrencynumberCuantas suben a la vez. Por defecto, 3: mas satura la conexion y todas acaban mas tarde.
customRequestUploadRequestTu propia subida (un SDK, una URL firmada...). Manda sobre `http`.
directorybooleanElegir una CARPETA entera en vez de ficheros sueltos. Soltar una carpeta encima no la recorre.
disabledboolean—
errorstring—
hiddenLabelbooleanLa etiqueta solo para el lector de pantalla. La zona de soltar ya lleva su propio nombre, asi que se puede ocultar a la vista sin perder nada.
hintstringTexto de ayuda: qué formatos y qué tamaño se admiten.
httpHttpUploadConfigSubir por HTTP. Sin esto hace falta `customRequest`.
inputRefRef<HTMLInputElement>El `<input type="file">` de verdad (va escondido), para abrir el selector desde un boton propio con `inputRef.current?.click()` (AMS-735).
maxCountnumberCuantos ficheros caben como mucho. Los que sobran se rechazan con su motivo. Sin esto, sin tope.
maxSizeMbnumberTamaño máximo por fichero, en megabytes.
multipleboolean—
onChange(entries: readonly UploadEntry[]) => voidAvisa de cada cambio de la lista: un fichero nuevo, un avance, un fallo, uno que acaba.
onFailed(entry: UploadEntry) => voidUn fichero ha fallado. No incluye los que se cancelan quitandolos.
onReject(rejected: readonly RejectedFile[]) => voidSe llama con los que no pasaron el filtro (tipo, tamano, cuantos caben).
onUploaded(entry: UploadEntry) => voidUn fichero ha subido del todo.
size"sm" | "md" | "lg"—

Acepta además los atributos del elemento que pinta: className, style, data-*, aria-* y sus eventos.

Mandos

Estas variables CSS son la forma de adaptarlo. Se declaran sobre el selector del componente, no en :root: la hoja las redeclara en la propia regla y una declaración en el mismo elemento gana siempre.

VariablePor defecto
--amset-uploader-gapvar(--amset-space-3)

Cómo se cambia

.amset-uploader {
  --amset-uploader-gap: ...;
}

En el banco de pruebas

Cada estado y cada variante, para tocarlos de uno en uno, en su ficha de ui.amset.tech: