Conclusiones clave
- Uppy se encarga de la selección de archivos y del progreso de subida; su plugin de Transloadit conecta las subidas con validación, procesamiento y exportación gestionados a tu propio almacenamiento.
- 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.
Una API de subida de archivos debería conectar subida autenticada → validación → procesamiento → almacenamiento del cliente. Esta guía implementa esa ruta para imágenes: Uppy proporciona la experiencia de subida, Transloadit ejecuta el flujo de procesamiento gestionado y tu bucket S3 almacena el original aceptado y la vista previa. Uppy también funciona de forma independiente de Transloadit; tu aplicación sigue siendo responsable de autenticar a los usuarios y decidir cuándo un recurso está listo para publicarse.
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 lo almacena. Es un modelo fácil de entender y ofrece a la aplicación control inmediato, pero cada byte consume tu capacidad de entrada, memoria o disco temporal, tiempo de conexión y salida de datos. 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 conserva el original, cómo se relacionan los derivados con él, qué identificadores sobreviven a los cambios de nombre y quién elimina cada copia. Transloadit conserva los resultados temporales durante al menos 24 horas, mientras que sus URLs de acceso pueden vencer después de unas horas. Exporta los archivos que deban conservarse. Las URLs temporales solo sirven para recuperaciones a corto plazo, no para incrustar archivos ni entregarlos repetidamente 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.
Antes de usar este ejemplo, activa «Require a correct Signature» en la Configuración del Workspace, guarda el Template siguiente y configura su ID en TRANSLOADIT_UPLOAD_TEMPLATE_ID en el servidor. Guarda el acceso AWS a tu bucket privado como credenciales de Template con el nombre my_s3_credentials. La Auth Key puede llegar al navegador; el Auth Secret y las credenciales AWS no. El endpoint de firma debe devolver Cache-Control: no-store para que cada operación autorizada reciba parámetros nuevos.
Instala @uppy/core, @uppy/dashboard y @uppy/transloadit en el frontend y el SDK de Node transloadit en el servidor. Inicializa el ejemplo del navegador después de que exista un elemento como <div id="photo-upload"></div>. Implementa /api/transloadit-params en tu framework con autenticación de sesión y autorización de subida antes de llamar a la función de firma. Rechaza las solicitudes no autenticadas o no autorizadas; la función auxiliar no es un endpoint de autenticación.
El ejemplo permite una imagen de hasta 10 MiB en formato JPEG, PNG o WebP. Las restricciones de Uppy ofrecen información inmediata, mientras que los límites firmados auth.max_size y auth.max_number_of_files y el filtro del Template en el servidor hacen cumplir la política. waitForEncoding: true espera a la Assembly, incluida la exportación, en lugar de confundir el final de la transferencia con la finalización del flujo.
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Transloadit from '@uppy/transloadit'
import '@uppy/core/css/style.min.css'
import '@uppy/dashboard/css/style.min.css'
// Mount this once after <div id="photo-upload"></div> exists in your page.
const uppy = new Uppy({
restrictions: {
maxNumberOfFiles: 1,
maxFileSize: 10 * 1024 * 1024,
allowedFileTypes: ['image/jpeg', 'image/png', 'image/webp'],
},
}).use(Dashboard, { inline: true, target: '#photo-upload' }).use(Transloadit, {
async assemblyOptions() {
const response = await fetch('/api/transloadit-params', {
credentials: 'same-origin',
cache: 'no-store',
})
if (!response.ok) {
throw new Error('Could not authorize this upload')
}
return response.json()
},
waitForEncoding: true,
retryDelays: [0, 1000, 3000, 5000, 10000],
})
uppy.on('transloadit:assembly-created', (assembly) => {
// Associate this ID with the server-side operation before the user leaves the page.
console.log('Assembly started:', assembly.assembly_id)
})
uppy.on('transloadit:complete', (assembly) => {
// Record completion against the ID persisted at transloadit:assembly-created.
console.log('Processing completed. Assembly:', assembly.assembly_id)
})
uppy.on('transloadit:assembly-error', () => {
// Show this through the application’s accessible status UI, not raw API errors or URLs.
console.error('Processing failed. Check the Assembly in your workspace.')
})
uppy.on('upload-error', () => {
// Transloadit API signature rejections and Assembly errors also reach this event.
// Failures thrown by assemblyOptions() use Uppy’s general error event instead.
// Deduplicate application notices.
console.error('The upload workflow failed. Check its status before retrying.')
})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(): { params: string; signature: string } {
// Call this only after the server has authenticated the request and authorized the operation.
const params = {
auth: {
expires: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
max_size: 10 * 1024 * 1024,
max_number_of_files: 1,
nonce: randomUUID(),
},
template_id: requiredEnvironmentValue('TRANSLOADIT_UPLOAD_TEMPLATE_ID'),
}
return transloadit.calcSignature(params)
}Conecta la recepción, la validación, el procesamiento y la exportación
Una Assembly conecta toda la ruta: subida autenticada con Uppy → validación con /file/filter → procesamiento con /image/resize → exportación con /s3/store a un bucket del cliente. El Template guardado define el flujo y cada dependencia use determina qué archivos llegan al siguiente Step. Uppy proporciona la experiencia de subida; Transloadit ejecuta el flujo gestionado, no tu servidor de aplicaciones.
El filtro comprueba el tipo MIME detectado y el tamaño del archivo y solo envía las imágenes aceptadas a los Steps de vista previa y exportación. error_on_decline: true convierte un rechazo en un error de Assembly. Las comprobaciones de MIME y tamaño no son análisis de malware ni moderación de contenido; añade esos Steps antes del procesamiento y la exportación cuando tu política lo requiera.
Usa un bucket S3 privado con Block Public Access activado y credenciales de Template con permisos debidamente limitados. acl: "bucket-default" omite la ACL del objeto y depende de la política de acceso del bucket; no convierte un bucket público en privado. La exportación guarda el original aceptado y una vista previa limitada a 1600 × 1600 píxeles en rutas específicas de la Assembly y del archivo. Ninguna exportación lee directamente de :original sin filtrar.
{
"allow_steps_override": false,
"steps": {
":original": {
"robot": "/upload/handle"
},
"accepted_images": {
"use": ":original",
"robot": "/file/filter",
"accepts": [
["${file.mime}", "regex", "^image/(jpeg|png|webp)$"]
],
"declines": [["${file.size}", ">", 10485760]],
"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",
"acl": "bucket-default",
"path": "uploads/${assembly.id}/${file.id}/${file.url_name}"
}
}
}Registrar la operación
Captura el ID de la Assembly cuando se emita transloadit:assembly-created, no solo en el callback de finalización. Asócialo en tu servidor con el usuario autenticado y el registro de subida; un ID enviado por el navegador no demuestra su pertenencia.
Confirmar el almacenamiento permanente
Reconcilia el estado en tu servidor o verifica la firma de una notificación de Assembly. Exige ASSEMBLY_COMPLETED y ambas salidas esperadas en results.exported antes de marcar el recurso como listo. Guarda referencias a objetos permanentes, no URLs temporales de procesamiento; una URL de objeto privado sigue necesitando una entrega autorizada.
Gestionar fallos parciales
No publiques operaciones fallidas y evita que las notificaciones de finalización repetidas tengan efectos duplicados. El original puede exportarse antes de que termine la vista previa, por lo que un error de Assembly no significa que el bucket esté vacío. Reconcilia o elimina los objetos parciales antes de reintentar.
Prueba un video grande desde la subida interrumpida hasta la exportación privada
Para un flujo de video, crea una credencial de Template llamada large-upload-output con credenciales IAM cuyo permiso s3:PutObject se limite al prefijo privado upload-tests/. Sigue la configuración IAM de /s3/store para los permisos s3:ListBucket y s3:GetBucketLocation a nivel de bucket; no hace falta consultar la región cuando la credencial de Template incluye bucket_region. Sustituye YOUR_AUTH_KEY por la Auth Key del workspace (no su Auth Secret), guarda el siguiente Template y exige Signature Authentication en ese Template. Usa un bucket privado con Block Public Access habilitado y Object Ownership configurado como Bucket owner enforced. El ajuste acl: "bucket-default" omite la ACL del objeto; el acceso sigue controlado por las políticas de tu bucket y de IAM. Para la prueba, asigna a TRANSLOADIT_UPLOAD_TEMPLATE_ID en el endpoint de firma autenticado el ID de este Template de video guardado. Reutiliza la integración de Uppy anterior con un archivo seleccionado por el usuario y una instancia de Uppy. Los límites del Template de 256 MiB y un archivo son reglas de ejemplo. Refleja esos límites en la opción restrictions de Uppy core (maxFileSize, maxNumberOfFiles) para dar aviso temprano en el selector; las comprobaciones del servidor siguen siendo necesarias. Para esta prueba de video, sustituye la restricción de imágenes por allowedFileTypes: ["video/*"] y establece tanto maxFileSize en el navegador como auth.max_size en los parámetros firmados en 256 * 1024 * 1024; conserva ambos límites de número de archivos en 1. Comprueba los límites de subida del workspace y los formatos de origen compatibles antes de la prueba. El Template detecta la familia MIME de video, crea una versión MP4 de dimensiones limitadas y exporta esa versión y el original aceptado. No es una política completa de protección frente a malware o contenido inapropiado.
El fin de la transferencia no es el final del proceso. Con waitForEncoding: true, el navegador espera al procesamiento, pero tu aplicación sigue necesitando un ID de Assembly persistente y notificaciones verificadas o una consulta del Assembly Status si desaparece la pestaña. Un fallo de exportación no debe marcar el recurso como listo. Confirma ASSEMBLY_COMPLETED, la versión de video requerida y ambos objetos privados en S3; compara la suma de comprobación del original exportado con la entrada antes de registrar el éxito. Estos objetos privados no son automáticamente URL públicas de reproducción.
Ejecuta tres controles sin interrupciones y tres pruebas interrumpidas con el mismo video propio de 100–200 MiB. Registra los bytes exactos y SHA-256 del archivo, duración y códecs, versiones del navegador y los paquetes, Template, región, plan y configuración de red. En Chrome DevTools, aplica un perfil de limitación personalizado y registra sus ajustes, cambia a Offline cerca del 25 % de la subida durante 10 segundos y restaura el perfil sin recargar. Ante fallos de red detectados mientras el navegador está sin conexión y quedan reintentos, el plugin tus de Uppy instalado pausa su cola hasta un evento online. Cada reintento sigue consumiendo un intento; el avance de la subida puede reiniciar el contador. La suma de retryDelays no es un límite de tiempo sin conexión. Verifica que una solicitud HEAD indique el Upload-Offset guardado y que las solicitudes PATCH posteriores continúen con el mismo recurso tus. Esto prueba una interrupción emulada en el navegador, no la conmutación por error del servidor ni todas las condiciones de red.
Mide desde el inicio de la subida hasta la primera Assembly completada con los objetos exportados verificados, no solo hasta el último byte subido. Registra también el tiempo desde la reconexión hasta el final, los bytes retransmitidos cuando sean observables, los fallos, las Assemblies duplicadas y el número real de ejecuciones. Es un procedimiento de prueba reproducible, no un resultado de benchmark publicado. Los reintentos limitados pueden agotarse por fallos repetidos de solicitudes, el plazo de subida de la Assembly de ocho horas sigue vigente y este ejemplo en memoria no restaura el estado tras recargar o cerrar la pestaña. Prueba por separado la cancelación, la autorización vencida, los archivos que superan el límite y las credenciales de exportación revocadas. Consulta la API de subidas reanudables para la transición del protocolo y la demo de video, miniaturas y S3 (English) para un ejemplo de procesamiento y exportación pública.
{
"allow_steps_override": false,
"auth": {
"key": "YOUR_AUTH_KEY",
"max_size": 268435456,
"max_number_of_files": 1
},
"steps": {
":original": { "robot": "/upload/handle" },
"accepted_video": {
"use": ":original",
"robot": "/file/filter",
"accepts": [["${file.mime}", "regex", "^video/"]],
"error_on_decline": true
},
"rendition": {
"use": "accepted_video",
"robot": "/video/encode",
"ffmpeg_stack": "v7",
"preset": "web/mp4/360p",
"width": 640,
"height": 360,
"resize_strategy": "fit",
"result": true
},
"exported": {
"use": ["accepted_video", "rendition"],
"robot": "/s3/store",
"credentials": "large-upload-output",
"acl": "bucket-default",
"path": "upload-tests/${assembly.id}/${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-OffsetconHEADy continuando conPATCH; 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_overrideestablecido en false impide que un cliente no confiable sustituya sus Steps o seleccione otro destino de almacenamiento mediante sustituciones de Steps. - Exporta los archivos que deban conservarse: los resultados temporales se retienen durante al menos 24 horas, pero sus URLs pueden vencer después de unas horas y solo sirven para recuperaciones limitadas a corto plazo.
- 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_UPLOADINGhasta 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
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
Prueba las opciones de retransmisión, almacenamiento directo y procesamiento directo con archivos representativos y fallos de red.
- 3
Implementa autorización de corta duración en el servidor, reanudación, validación, exportación y gestión idempotente de resultados.
- 4
Realiza pruebas de carga en la ruta elegida y ensaya el vencimiento, los callbacks duplicados, las credenciales revocadas y los fallos parciales.
Cuándo resulta útil Transloadit
Usa Transloadit cuando las subidas necesiten un flujo gestionado que conecte transferencia reanudable, validación en el servidor, procesamiento y exportaciones a almacenamiento que controles. Los contratos exactos de los parámetros están en la documentación de los Robots /upload/handle, /file/filter, /image/resize, /video/encode 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?
Usa un Robot de exportación para los archivos que deban conservarse. Los resultados temporales del procesamiento se retienen durante al menos 24 horas, mientras que sus URLs pueden vencer después de unas horas. Los flujos de producción deben exportar a almacenamiento controlado o usar las URLs temporales solo para recuperaciones limitadas 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.
¿Uppy necesita Transloadit?
No. Uppy es un cargador de código abierto que también funciona de forma independiente con un bucket S3, un servidor tus u otro endpoint de subida compatible. Su plugin de Transloadit conecta las subidas con flujos gestionados de validación, procesamiento y exportación. Elige Uppy con almacenamiento directo cuando solo necesites transferir archivos; considera Uppy con Transloadit cuando los archivos también necesiten un flujo de procesamiento gestionado.
¿Puedo usar una API de subida gestionada con mi propio almacenamiento?
Sí. En este ejemplo, Uppy sube archivos a Transloadit, la Assembly valida la imagen y crea una vista previa, y /s3/store exporta el original aceptado y la vista previa a tu bucket S3 mediante credenciales de Template guardadas. La ruta va del navegador a S3 pasando por Transloadit, no una subida directa del navegador a S3: los bytes y los resultados temporales pasan por Transloadit. Tu aplicación controla el acceso al almacenamiento permanente, la retención y la publicación.