Subidas e integración frontend

# Guía de API de subida de archivos: arquitectura, seguridad y selección de proveedores

Elige e implementa una API de subida comparando arquitectura, reanudación, transferencia directa a la nube, seguridad, límites de almacenamiento y proveedores.

Publicado el 24 de agosto de 2026

## Conclusiones clave

* Identifica explícitamente la ruta de los bytes: retransmisión mediante la aplicación, almacenamiento directo de objetos, servicio de procesamiento directo o importación desde una fuente remota.
* Trata la reanudación, los reintentos, la idempotencia y el vencimiento como controles de confiabilidad independientes, con comportamientos distintos ante fallos.
* Mantén la autorización de subida en el servidor, valida las propiedades observadas del archivo y publica únicamente desde un almacenamiento permanente controlado.

Elegir una API de subida de archivos es una decisión de arquitectura, no una comparación de widgets. El diseño adecuado controla por dónde viajan los bytes, quién puede autorizar una transferencia, cómo se reanuda el trabajo interrumpido, cuándo un archivo pasa a ser confiable, dónde se guardan las copias persistentes y cómo regresan al producto los resultados del procesamiento.

## En esta guía

1. [Define la tarea de subida antes de elegir un widget](#file-upload-api-guide-section-1)
2. [Elige una de las cuatro rutas explícitas para los bytes](#file-upload-api-guide-section-2)
3. [Diseña la reanudación por separado de los reintentos](#file-upload-api-guide-section-3)
4. [Autoriza la intención en el servidor y desconfía de los bytes](#file-upload-api-guide-section-4)
5. [Separa el almacenamiento persistente del procesamiento de subidas](#file-upload-api-guide-section-5)
6. [Decide entre desarrollar o comprar en el límite de responsabilidad](#file-upload-api-guide-section-6)
7. [Compara proveedores con pruebas de fallos, no por cantidad de funciones](#file-upload-api-guide-section-7)
8. [Implementa una subida firmada con Uppy y Transloadit](#file-upload-api-guide-section-8)
9. [Conecta la recepción, la validación, el procesamiento y la exportación](#file-upload-api-guide-section-9)

## Lo más importante

* Decide si desarrollar, comprar o adoptar un modelo híbrido probando los requisitos de recuperación, seguridad, procesamiento y operación, no solo la demostración del caso ideal.
* Usa ejemplos específicos de un framework solo cuando sea posible mantener y probar su ciclo de vida, autorización en el servidor y comportamiento de recuperación.

## Define la tarea de subida antes de elegir un widget

Una subida en producción comienza antes de que se mueva el primer byte. La aplicación identifica al usuario, decide qué operación está permitida, especifica la cantidad y el tamaño aceptables de los archivos y crea un registro que puede persistir más que una pestaña del navegador. La transferencia es solo una etapa. La validación, el procesamiento, la exportación, la notificación y la conciliación determinan si después el producto puede usar el archivo de forma segura.

Redacta un contrato de finalización en términos del producto. «La solicitud devolvió 200» es una condición débil; «el original y las versiones derivadas requeridas están almacenados bajo este inquilino, el registro del recurso identifica sus versiones y un callback duplicado no cambia nada» es verificable. Registra qué fallos pueden volver a intentar los usuarios, cuáles requieren una nueva subida y cuáles dejan un estado visible para el operador que permita la recuperación.

### Plano de control

Contiene la identidad, la autorización, los límites, la elección del flujo de trabajo, los metadatos, el estado y las referencias a los resultados, en lugar del contenido del archivo.

### Plano de datos

Transporta los bytes del archivo entre el usuario, la aplicación, el servicio de subida, la capa de procesamiento y el destino de almacenamiento persistente.

### Transición de confianza

Indica cuándo una subida no confiable ha superado las comprobaciones necesarias para el procesamiento, almacenamiento, vista previa o entrega pública.

## Elige una de las cuatro rutas explícitas para los bytes

En una retransmisión mediante la aplicación, el navegador envía el archivo a tu servidor y este lo reenvía o almacena. Es un modelo fácil de entender y ofrece a la aplicación control inmediato, pero cada byte consume capacidad de entrada, memoria o disco temporal, tiempo de conexión y capacidad de salida. Es adecuado para archivos pequeños y poco frecuentes cuando el servidor existente puede aplicar límites y transmitirlos de forma segura sin guardar cuerpos completos en búfer.

«Directo a la nube» es ambiguo, así que especifica el destino. Un navegador puede subir directamente al almacenamiento de objetos con credenciales de corta duración, subir directamente a un servicio de procesamiento como Transloadit o solicitar a un servicio que importe una URL remota existente. El almacenamiento directo minimiza los saltos cuando la persistencia es la única tarea. El procesamiento directo mantiene la aplicación fuera de la ruta de los datos mientras un flujo de trabajo valida, transforma y exporta los archivos a un almacenamiento propio.

### Retransmisión mediante la aplicación

Resulta útil para cargas de trabajo moderadas y políticas sencillas, pero la aplicación asume la capacidad de transferencia, los tiempos de espera, los archivos temporales y el escalamiento.

### Almacenamiento directo de objetos

Es la mejor opción cuando la primera copia persistente es el resultado principal y el procesamiento posterior puede activarse de forma confiable mediante un evento de almacenamiento o una cola.

### Servicio de procesamiento directo

Resulta útil cuando la subida y la validación asíncrona, los archivos derivados, los metadatos o la exportación a varios destinos forman parte de una sola tarea observable.

### Importación desde una fuente remota

Transfiere bytes de servidor a servidor, lo que evita usar la conexión del usuario, pero requiere autorización explícita de la fuente y límites de obtención.

## Diseña la reanudación por separado de los reintentos

Un reintento vuelve a iniciar una operación; una transferencia reanudable continúa una subida existente desde un desplazamiento de bytes confirmado por el servidor. Con el protocolo tus, el cliente conserva la URL de subida, solicita al servidor el valor de `Upload-Offset` y envía únicamente los bytes restantes. Conserva esa URL fuera del estado transitorio del componente si debe ser posible recuperarse tras una actualización o un fallo, y genera con cuidado las huellas digitales de los archivos para que el archivo local de un usuario nunca se vincule al recurso de subida de otro.

La reanudación no hace que el tiempo sea ilimitado ni que el procesamiento sea idempotente. Una Assembly de Transloadit sigue teniendo ocho horas desde su creación para terminar la subida, y crear una Assembly de reemplazo puede duplicar el trabajo a menos que la aplicación concilie el identificador anterior. Define cómo gestiona el cliente las pausas, el tiempo sin conexión, los recursos vencidos, los archivos modificados, las subidas abandonadas y la pérdida de una respuesta de finalización después de que el servidor haya aceptado los últimos bytes.

### Identidad de reanudación

Conserva la URL de subida emitida por el servidor junto con el usuario autenticado, la huella digital del archivo local, la longitud esperada y el registro de la operación.

### Ruta de vencimiento

Cuando el recurso de subida o la Assembly haya vencido, crea una operación nueva y retira el identificador obsoleto en lugar de reintentarlo indefinidamente.

### Conciliación de finalización

Consulta el estado persistente después de fallos de red ambiguos para que el cliente no suponga que la ausencia de respuesta implica la ausencia de bytes.

## Autoriza la intención en el servidor y desconfía de los bytes

El código del navegador puede contener una Auth Key pública, pero nunca debe contener el Auth Secret de Transloadit ni credenciales permanentes de almacenamiento. Autentica al usuario en tu aplicación, selecciona en el servidor un Template guardado y devuelve parámetros firmados de corta duración con un `nonce` único. Establece `allow_steps_override` en false cuando el navegador no tenga un motivo legítimo para sustituir Steps, porque, de lo contrario, un grafo de Steps seleccionado por el cliente podría cambiar el comportamiento del procesamiento o la exportación.

Una firma válida demuestra que se autorizó el payload de parámetros; no demuestra que los bytes subidos coincidan con un nombre de archivo, una extensión, un tipo MIME declarado, un inquilino o una política de moderación. Limita el cuerpo de las solicitudes antes de realizar tareas costosas, inspecciona las propiedades observadas de los archivos, rechaza el contenido no compatible, analízalo cuando lo exija el modelo de amenazas y mantén los resultados no confiables fuera del almacenamiento público hasta que el flujo de trabajo alcance un estado aprobado.

### Autorización de corta duración

Concede permiso de subida solo después de autenticar al usuario en la aplicación y limítalo durante un periodo breve a una operación seleccionada por el servidor.

### Propiedades observadas

Para el enrutamiento, usa el tipo detectado, las dimensiones, la duración y otros metadatos inspeccionados, en lugar de confiar únicamente en la extensión.

### Cuarentena antes de publicar

Separa la recepción de la entrega pública para que los archivos no válidos, maliciosos o rechazados por la política nunca se conviertan de forma predeterminada en recursos de la aplicación.

## Separa el almacenamiento persistente del procesamiento de subidas

Un endpoint de subida no es automáticamente un sistema de registro. Decide qué bucket o base de datos de recursos será responsable del original, cómo se relacionan con él las versiones derivadas, qué identificadores se conservan tras cambiar los nombres y quién elimina cada copia. Si una Assembly de Transloadit no tiene un Step de exportación, los archivos temporales se eliminan después de 24 horas y sus URL de acceso pueden vencer al cabo de unas horas. Las URL se limitan a la recuperación a corto plazo, no a la inserción ni a la entrega reiterada en el producto.

Incluye la exportación en la Assembly cuando el éxito del flujo de trabajo requiera tanto el procesamiento como la persistencia. Un Robot de exportación puede usar credenciales de Template almacenadas para escribir los resultados en el destino elegido como parte del flujo de trabajo. Como alternativa, primero sube directamente a un almacenamiento propio e inicia el procesamiento mediante un evento controlado. Esa ruta proporciona una copia persistente desde una etapa temprana, pero añade tareas de orquestación y otra transferencia al procesador.

### Propiedad del original

Indica si se conserva el original, durante cuánto tiempo, con qué clave de inquilino y si los flujos de trabajo posteriores pueden volver a leerlo.

### Linaje de los derivados

Almacena el identificador de origen, la configuración del flujo de trabajo, la función del resultado, las dimensiones, el formato y la suma de comprobación necesarios para explicar cada resultado.

### Límite de entrega

Entrega los recursos aprobados desde un almacenamiento permanente y mediante una capa de entrega diseñada para ese fin, en lugar de usar URL temporales de procesamiento.

## Decide entre desarrollar o comprar en el límite de responsabilidad

Desarrolla la ruta de transferencia cuando los requisitos sean específicos y el equipo esté preparado para asumir todo el ciclo de vida. Un formulario pequeño y autenticado que transmita archivos cortos a un bucket existente quizá no justifique otra plataforma. Aun así, la estimación debe incluir el análisis multipart, la contrapresión, la aplicación de límites de tamaño, la reanudación o su ausencia deliberada, la limpieza, los controles contra abusos, la observabilidad, las actualizaciones y el soporte para fallos que ocurran después de que finalice la solicitud.

Un servicio gestionado se vuelve más atractivo a medida que el flujo de trabajo combina redes poco confiables, archivos grandes, experiencia de usuario en el navegador, fuentes remotas, inspección multimedia, transformación o varios destinos de almacenamiento. Comprar un servicio no elimina la responsabilidad de la aplicación: las comprobaciones de inquilinos, la autorización, los registros de recursos, la retención, la publicación y la gestión de incidentes siguen bajo tu responsabilidad. Un diseño híbrido suele funcionar mejor, con almacenamiento y estado de negocio propios alrededor de una capa gestionada de transferencia y procesamiento.

### Costo de desarrollo propio

Incluye los costos de ingeniería, infraestructura, trabajo de guardia, mantenimiento de protocolos, revisión de seguridad y soporte al usuario, no solo las tarifas de almacenamiento de objetos.

### Costo de adquisición

Modela los bytes de subida, las operaciones de procesamiento, los reintentos, la transferencia al almacenamiento, los cargos mínimos, el nivel de soporte y el crecimiento previsto.

### Propiedad híbrida

Mantén en tu producto la identidad, las políticas, los metadatos y el almacenamiento permanente, mientras delegas la ruta de datos especializada y el trabajo de procesamiento.

## Compara proveedores con pruebas de fallos, no por cantidad de funciones

Crea una matriz de evaluación basada en la carga de trabajo real del producto. Compara clientes web y móviles, soporte para protocolos abiertos, tamaño máximo de archivo, comportamiento de concurrencia, endpoints geográficos, importaciones remotas, amplitud de procesamiento, destinos de almacenamiento, aislamiento de la credencial, verificación de webhooks, conservación de estados, soporte y opciones de salida. Marca cada función como obligatoria, opcional o irrelevante antes de consultar las páginas de los proveedores.

Ejecuta los mismos casos de prueba con cada candidato serio. Interrumpe una subida grande, recarga la página, envía un evento de finalización duplicado, revoca las credenciales de almacenamiento, rechaza un archivo después de recibirlo, supera un límite y pierde la respuesta final. Mide la recuperación visible para el usuario, los bytes retransmitidos, el tiempo hasta obtener un resultado persistente, la evidencia para el operador y la limpieza. Un selector de archivos bien diseñado dice poco sobre estas propiedades en producción.

### Portabilidad del protocolo

Un protocolo reanudable abierto y clientes reemplazables reducen el acoplamiento durante una migración, pero los esquemas del flujo de trabajo y de los resultados aún requieren planificar la migración.

### Evidencia operativa

Exige identificadores de tarea estables, estados terminales, marcas de tiempo, errores que permitan actuar, callbacks verificados y un procedimiento documentado de reejecución.

### Economía integral

Compara los costos de transferencia, procesamiento, almacenamiento, entrega, soporte, ingeniería y recuperación ante fallos con un volumen mensual representativo.

## Implementa una subida firmada con Uppy y Transloadit

El ejemplo del navegador permite que Uppy gestione la selección y la transferencia mediante el protocolo tus, mientras el plugin de Transloadit solicita parámetros de Assembly a tu aplicación. El endpoint del servidor debe autenticar al usuario actual antes de devolver el objeto de `calcSignature`. Debe seleccionar por sí mismo el Template en lugar de aceptar Steps arbitrarios o un destino de almacenamiento proporcionado por quien realiza la solicitud, y debe limitar la tasa de solicitudes de autorización de forma independiente del tráfico de subida.

La Auth Key identifica el Workspace y puede estar presente en los parámetros devueltos; el Auth Secret permanece en el proceso del servidor. En el Template guardado, desactiva las sustituciones de Steps salvo que un caso de uso revisado las necesite. Decide si la interfaz espera a que termine la codificación o regresa después de la subida y, en cualquier caso, guarda de forma persistente el ID de la Assembly para que un proceso en segundo plano o un webhook verificado pueda conciliar el resultado final.

Permitir que Uppy solicite parámetros acotados de Assembly desde tu propio back end

```
import Uppy from '@uppy/core'
import Transloadit from '@uppy/transloadit'

const uppy = new Uppy().use(Transloadit, {
  async assemblyOptions() {
    const response = await fetch('/api/transloadit-params', {
      credentials: 'same-origin',
    })
    if (!response.ok) {
      throw new Error('Could not authorize this upload')
    }
    return response.json()
  },
  waitForEncoding: true,
})

uppy.on('transloadit:complete', (assembly) => {
  console.log(assembly.assembly_id, assembly.results)
})
```

Firmar un Template seleccionado por el servidor sin exponer el Auth Secret

```
import { randomUUID } from 'node:crypto'
import { Transloadit } from 'transloadit'

function requiredEnvironmentValue(name: string): string {
  const value = process.env[name]
  if (value == null) throw new Error(`Missing environment variable: ${name}`)
  return value
}

const transloadit = new Transloadit({
  authKey: requiredEnvironmentValue('TRANSLOADIT_KEY'),
  authSecret: requiredEnvironmentValue('TRANSLOADIT_SECRET'),
})

export function createAuthorizedUploadParameters() {
  // Call this only after the server has authenticated the request and authorized the operation.
  return transloadit.calcSignature({
    auth: {
      expires: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
      nonce: randomUUID(),
    },
    template_id: requiredEnvironmentValue('TRANSLOADIT_UPLOAD_TEMPLATE_ID'),
  })
}
```

## Conecta la recepción, la validación, el procesamiento y la exportación

El Template acepta subidas desde el navegador mediante `/upload/handle`, comprueba la familia MIME observada con `/file/filter`, crea una vista previa acotada mediante `/image/resize` y exporta tanto el original aceptado como la vista previa con `/s3/store`. La credencial de Template con nombre evita que las credenciales del bucket se incluyan en los parámetros del navegador, mientras que `allow_steps_override` impide que quien realiza la solicitud sustituya ese destino mediante una sustitución de Step.

Trata esto como un ejemplo de arquitectura mínima, no como una política de seguridad universal. Añade reglas sobre el tamaño máximo de subida, la cantidad de archivos, el análisis antivirus, la moderación, los nombres, la retención y el destino según el modelo de amenazas del producto. Almacena el ID de la Assembly y los registros de los resultados exportados bajo el inquilino autenticado, y verifica que cada resultado esperado haya llegado al almacenamiento permanente antes de que la aplicación marque el recurso como listo.

Validar, derivar y exportar archivos con un Template bloqueado

```
{
  "allow_steps_override": false,
  "steps": {
    ":original": {
      "robot": "/upload/handle"
    },
    "accepted_images": {
      "use": ":original",
      "robot": "/file/filter",
      "accepts": [
        ["${file.mime}", "regex", "^image/"]
      ],
      "error_on_decline": true
    },
    "preview": {
      "use": "accepted_images",
      "robot": "/image/resize",
      "resize_strategy": "fit",
      "width": 1600,
      "height": 1600
    },
    "exported": {
      "use": ["accepted_images", "preview"],
      "robot": "/s3/store",
      "credentials": "my_s3_credentials",
      "path": "uploads/${file.id}/${file.url_name}"
    }
  }
}
```

## Detalles técnicos que conviene conocer

* En una subida del navegador a la aplicación, el servidor de la aplicación forma parte de la ruta de datos, mientras que un diseño directo al almacenamiento o al procesamiento mantiene los bytes del archivo fuera de ese controlador de solicitudes.
* El protocolo central de tus reanuda una transferencia leyendo del servidor el valor de `Upload-Offset` con `HEAD` y continuando con `PATCH`; enviar de nuevo el archivo completo es un reintento, no una reanudación.
* El plugin Transloadit de Uppy usa el protocolo tus para transferir archivos y puede solicitar parámetros firmados de Assembly a un back end de la aplicación mediante su función `assemblyOptions`.
* Transloadit Signature Authentication firma en un servidor de confianza los parámetros codificados en JSON mediante el Auth Secret; el secreto nunca debe enviarse al código del navegador.
* Un Template guardado con `allow_steps_override` establecido en false impide que un cliente no confiable sustituya sus Steps o seleccione otro destino de almacenamiento mediante sustituciones de Steps.
* Sin un Robot de exportación, Transloadit elimina los archivos temporales después de 24 horas, mientras que sus URL temporales pueden vencer después de unas horas y están destinadas únicamente a recuperaciones limitadas y de corta duración.
* En las subidas mediante el protocolo tus a Transloadit, la Assembly se crea antes de que lleguen los bytes de los archivos y permanece en `ASSEMBLY_UPLOADING` hasta que finalicen las subidas declaradas.
* La ventana de subida de Transloadit dura ocho horas desde la creación de la Assembly, por lo que un cliente reanudable aún necesita una ruta de reinicio deliberada cuando la Assembly haya vencido.

## Un enfoque práctico

1. 1\
   Documenta la ruta de los bytes, las transiciones de confianza, el propietario de la copia persistente y el contrato de finalización antes de elegir un cliente de subida.
2. 2\
   Prueba las opciones de retransmisión, almacenamiento directo y procesamiento directo con archivos representativos y fallos de red.
3. 3\
   Implementa autorización de corta duración en el servidor, reanudación, validación, exportación y gestión idempotente de resultados.
4. 4\
   Realiza pruebas de carga en la ruta elegida y ensaya el vencimiento, los callbacks duplicados, las credenciales revocadas y los fallos parciales.

Un flujo de trabajo multimedia de cuatro etapas

## Cuándo resulta útil Transloadit

Usa Transloadit cuando las subidas requieran la reanudación del protocolo tus, la experiencia de Uppy en el navegador, la incorporación desde fuentes remotas, el procesamiento de archivos en varios pasos o exportaciones a un almacenamiento bajo tu control. Los contratos exactos de los parámetros están en la documentación de los Robots `/upload/handle`, `/file/filter`, `/image/resize` y `/s3/store`.

## Límite de la arquitectura

Transloadit puede recibir archivos, ejecutar flujos de trabajo de procesamiento asíncrono y exportar resultados, pero tu aplicación sigue siendo responsable de la autenticación de usuarios, la autorización de inquilinos, el registro persistente de los recursos, la política de publicación y la entrega desde el almacenamiento permanente.

## Preguntas frecuentes

### ¿Qué significa «subida directa a la nube»?

No es una sola arquitectura. Puede referirse a una transferencia del navegador al almacenamiento de objetos, del navegador a un servicio de procesamiento o a una importación de servidor a servidor desde otro proveedor. Antes de comparar implementaciones, identifica el destino real de los bytes, el mecanismo de autorización, el propietario de la copia persistente y el desencadenante del procesamiento.

### ¿Los archivos deben pasar por el servidor de mi aplicación?

Solo cuando el beneficio para las políticas o la simplicidad compensa asumir el control de la ruta de datos. La retransmisión puede ser adecuada para subidas pequeñas y poco frecuentes, pero el almacenamiento o procesamiento directos evitan consumir ancho de banda de la aplicación, tiempo de solicitud, disco temporal y capacidad de conexión por cada byte.

### ¿Un reintento equivale a una subida reanudable?

No. Un reintento normalmente vuelve a iniciar la transferencia, mientras que la reanudación continúa un recurso existente desde el desplazamiento de bytes confirmado por el servidor. El cliente debe conservar la identidad de la subida y seguir gestionando el vencimiento, los cambios en los archivos locales y las respuestas finales ambiguas.

### ¿Transloadit almacena permanentemente los archivos subidos?

No, a menos que el flujo de trabajo los exporte a un destino permanente. Sin un Robot de exportación, los archivos temporales se eliminan después de 24 horas y sus URL pueden vencer al cabo de unas horas. Los flujos de trabajo de producción deben exportarlos a un almacenamiento controlado o usar esas URL únicamente para recuperarlos a corto plazo en infraestructura propia.

### ¿Cuándo conviene desarrollar una API de subida en lugar de comprar una?

Desarrollar una solución propia puede ser razonable para una ruta específica con archivos pequeños, un solo destino de almacenamiento, redes predecibles y un equipo preparado para asumir la seguridad y las operaciones. La infraestructura gestionada justifica su costo cuando la reanudación, las fuentes remotas, los archivos grandes, el procesamiento, los múltiples destinos o la recuperación ante fallos se convertirían en un producto independiente.

### ¿Qué debe incluir una guía de subida específica para un framework?

Una guía de un framework debe centrarse en código mantenible, comportamiento del ciclo de vida, autorización en el servidor, recuperación y pruebas específicas para ese framework. Consulta las referencias enlazadas sobre reanudación y API para conocer los contratos exactos del protocolo y las solicitudes, y evalúa los proveedores según los requisitos arquitectónicos generales anteriores.

## Crea el flujo de trabajo

Pasa del concepto a una Assembly probada con documentación de Robots y demos funcionales.

### Robots relevantes

* [/upload/handle](/es/docs/robots/upload-handle.md)
* [/file/filter](/es/docs/robots/file-filter.md)
* [/image/resize](/es/docs/robots/image-resize.md)
* [/s3/store](/es/docs/robots/s3-store.md)
* [Explora las subidas de archivos gestionadas](/es/services/handling-uploads.md)
* [Lee la referencia de la API de subida reanudable](/es/docs/api/resumable-uploads.md)
* [Lee la referencia de Signature Authentication](/es/docs/api/authentication.md)
* [Lee la documentación de la API](/es/docs.md)
* [Explora demos funcionales EN (English)](/demos.md)
* [Crea un Workspace gratuito](/c/signup/)

Subidas e integración frontend

## Continúa con guías relacionadas

* [Cómo aceptar subidas grandes pese a una conexión interrumpida](/es/guides/resumable-uploads-for-large-files.md)\
  Acepta subidas de varios gigabytes mediante el protocolo tus, reanúdalas tras perder la conexión y mantén viva la Assembly hasta terminarlas.
* [Automatización de medios: de la subida a resultados confiables](/es/guides/media-automation.md)\
  Automatiza la recepción, transformación, validación y exportación repetibles de medios, a la vez que preservas la observabilidad y el control.
* [Subidas seguras de archivos en Next.js con Uppy y Templates firmados de Transloadit](/es/guides/secure-file-uploads-nextjs-uppy.md)\
  Crea una subida segura en Next.js App Router con Uppy: firma en servidor, Template bloqueado, validación autoritativa, transferencia reanudable y fin asíncrono.
* [Mejores bibliotecas JavaScript para subir archivos: Uppy vs FilePond vs Dropzone](/es/guides/best-javascript-file-upload-libraries.md)\
  Compara Uppy, FilePond y Dropzone según el protocolo de transferencia, el modelo de interfaz, la recuperación, la integración y el mantenimiento a largo plazo.
* [Subidas de archivos con React y Uppy: reanudación, vistas previas, validación y procesamiento](/es/guides/react-file-uploads-with-uppy.md)\
  Crea un componente de subida en React con Uppy: vistas previas, validación, progreso accesible, cancelación, reanudación y procesamiento con Transloadit.
