Subidas de archivos a gran escala: validación, almacenamiento y acceso
Las subidas de archivos a gran escala necesitan una validación clara, rutas de almacenamiento ordenadas, enlaces de descarga que expiren y permisos estrictos para proteger los archivos de los usuarios.

Qué hace que las subidas de archivos de usuarios sean difíciles a gran escala
Las subidas de usuarios parecen sencillas con unos pocos testers. Se complican cuando personas reales empiezan a enviar archivos reales: fotos grandes, PDFs escaneados y documentos misteriosos con la extensión equivocada. En ese punto, las subidas de archivos a gran escala dejan de ser un botón en un formulario y pasan a ser un problema de seguridad y operaciones.
Las primeras fisuras suelen aparecer en tres sitios: seguridad, coste y privacidad. Los atacantes intentan subir malware, los usuarios suben archivos que tu app no puede abrir y los equipos exponen por accidente documentos sensibles mediante una URL pública. Las facturas de almacenamiento crecen y el ancho de banda también cuando el mismo archivo se descarga una y otra vez.
Imágenes y PDFs crean problemas diferentes. Las imágenes pueden ser enormes, venir en muchos formatos e incluir metadatos ocultos (como la ubicación). Además necesitarás miniaturas y redimensionado para mantener la app rápida. Los PDFs son difíciles de previsualizar con seguridad, pueden incluir contenido embebido y a menudo contienen registros sensibles (facturas, identificaciones, contratos) que no deberían ser accesibles de forma amplia.
A escala, normalmente te enfrentas a más usuarios subiendo al mismo tiempo, archivos más grandes y más almacenamiento total, más descargas y reintentos por redes inestables, y más reglas: distintos equipos, roles y necesidades de retención.
El objetivo no es solo que las subidas funcionen. El objetivo es que sean seguras y fáciles de gestionar meses después: reglas claras, rutas de almacenamiento previsibles, metadata apta para auditoría y controles de acceso que reflejen cómo tu negocio comparte archivos realmente.
Mapea tus tipos de archivo y quién debe acceder a ellos
Antes de afinar almacenamiento o seguridad, aclara qué va a subir la gente y quién puede verlo. La mayoría de los problemas de subida a escala no son realmente problemas de almacenamiento. Son expectativas desajustadas sobre acceso, retención y riesgo.
Empieza listando categorías reales de archivos, no solo documentos e imágenes. Un avatar se comporta de forma muy distinta a un PDF de contrato, y una captura de pantalla de soporte difiere de un informe mensual.
Una forma práctica de mapear las subidas es vincular cada categoría a un patrón de acceso:
- Avatares e imágenes de perfil públicas suelen ser legibles por muchas personas y editables solo por su propietario.
- Recibos y facturas son privados por defecto, compartidos solo con roles de finanzas o el propietario de la cuenta.
- Contratos y archivos de cumplimiento están muy restringidos y a menudo necesitan trazabilidad y reglas de retención más estrictas.
- Informes y exportaciones pueden compartirse dentro de un equipo, pero deben limitarse al workspace o cliente correcto.
- Adjuntos de tickets suelen ser privados para los participantes del ticket y a veces con acceso limitado por tiempo.
Luego haz un snapshot rápido de riesgo. Las subidas pueden ocultar malware, filtrar datos sensibles (IDs, información bancaria, datos médicos) o exponer permisos rotos donde adivinar una URL concede acceso. Por eso las subidas de archivos a escala tienen tanto que ver con el control de acceso como con los bytes.
El rendimiento también importa. PDFs grandes, imágenes de alta resolución y redes móviles inestables causan subidas parciales y reintentos. Decide desde el principio qué subidas deben triunfar de forma fiable (facturas, identificaciones) y cuáles son opcionales (un banner de perfil).
Para cada tipo de archivo, responde unas preguntas temprano para no rehacer después:
- ¿Quién puede subir, ver, reemplazar y eliminar este archivo?
- ¿Es privado, compartido dentro de un grupo o público?
- ¿Debe el acceso expirar o ser revocable al instante?
- ¿Qué ocurre si la subida se interrumpe y se reintenta?
- ¿Cuánto tiempo lo conservas y quién puede exportarlo?
Si construyes con una herramienta como AppMaster, trata estas respuestas primero como reglas de producto y luego implémentalas en tu modelo de datos y endpoints para que los permisos sean consistentes en web y móvil.
Reglas de validación de subidas que previenen problemas desde temprano
Si quieres que las subidas de archivos a gran escala se mantengan seguras y predecibles, la validación es tu primera línea de defensa. Buenas reglas detienen archivos malos antes de que lleguen al almacenamiento y reducen los tickets de soporte porque los usuarios reciben feedback claro.
Empieza con una allowlist, no con una blocklist. Comprueba la extensión del nombre de archivo y también verifica el tipo MIME detectado a partir del contenido subido. Basarse solo en la extensión es fácil de eludir. Basarse solo en el MIME puede ser inconsistente entre dispositivos.
Los límites de tamaño deben concordar con el tipo de archivo y las reglas de producto. Las imágenes pueden estar bien entre 5 y 10 MB, mientras que los PDFs pueden necesitar un tope mayor. Los vídeos son otro problema y suelen necesitar su propia canalización. Si tienes planes de pago, vincula los límites al plan para poder decir: “Tu plan permite PDFs de hasta 10 MB” en lugar de mostrar un error vago.
Algunos archivos necesitan comprobaciones más profundas. Para imágenes, valida ancho y alto (y a veces la relación de aspecto) para evitar subidas gigantes que ralenticen las páginas. Para PDFs, el número de páginas puede importar cuando tu caso de uso espera un rango pequeño.
Renombra archivos al subirlos. Los nombres de usuario suelen incluir espacios, emojis o nombres repetidos como scan.pdf. Usa un ID generado más una extensión segura y guarda el nombre original en la metadata para mostrarlo.
Una línea base de validación que funciona para muchas apps podría ser:
- Tipos allowlist (extensión + MIME), rechaza todo lo demás.
- Límite máximo por tipo (y opcionalmente por plan).
- Validar dimensiones de imagen y rechazar tamaños extremos.
- Validar el recuento de páginas de PDF cuando tu caso de uso lo requiera.
- Renombrar a un nombre de archivo seguro y único y conservar el original en metadata.
Cuando la validación falla, muestra un único mensaje claro que el usuario pueda entender, como “Los PDFs deben pesar menos de 20 MB y tener máximo 50 páginas.” Al mismo tiempo, registra detalles técnicos para admins (MIME detectado, tamaño, ID de usuario y motivo). En AppMaster, estas comprobaciones pueden vivir en tu Business Process para que cada ruta de subida siga las mismas reglas.
Modelo de datos para subidas y metadata de archivos
Un buen modelo de datos hace que las subidas sean aburridas. El objetivo es registrar quién posee un archivo, para qué sirve y si es seguro usarlo, sin atar tu app a un único proveedor de almacenamiento.
Un patrón fiable es un flujo en dos pasos. Primero, crea un registro de subida en tu base de datos y devuelve un ID de subida. Segundo, sube el binario al almacenamiento usando ese ID. Esto evita archivos misteriosos en un bucket sin fila correspondiente y permite aplicar permisos antes de que se muevan los bytes.
Una tabla simple uploads (o colección) suele ser suficiente. En AppMaster, esto se mapea bien a un modelo PostgreSQL en el Data Designer y puede usarse en web y móvil.
Guarda lo que realmente necesitarás más tarde para soporte y auditoría:
- Referencia de propietario (
user_id) y ámbito (org_idoteam_id) - Propósito (avatar, invoice_pdf, ticket_attachment)
- Nombre de archivo original, tipo MIME detectado y
size_bytes - Puntero de almacenamiento (bucket/container,
object_key) más checksum (opcional) - Timestamps (
created_at,uploaded_at) y la IP/dispositivo del uploader (opcional)
Mantén el modelo de estados pequeño para que sea legible. Cuatro estados cubren la mayoría de productos:
pending: existe el registro, la subida no se completóuploaded: bytes almacenadosverified: pasó las comprobaciones y listo para usarblocked: falló las comprobaciones o por política
Planifica la limpieza desde el día uno. Los pending abandonados ocurren cuando los usuarios cierran una pestaña o pierden conexión. Un job diario puede borrar objetos de almacenamiento de filas pending caducadas, marcar filas como canceladas para informes, eliminar elementos blocked antiguos tras una ventana de retención y conservar los archivos verified hasta que las reglas de negocio digan lo contrario.
Este modelo te da trazabilidad y control sin añadir complejidad.
Organización del almacenamiento que se mantiene ordenada con el tiempo
Cuando las subidas de archivos a gran escala se acumulan, el mayor riesgo no es el coste de almacenamiento. Es el desorden. Si tu equipo no puede decir qué es un archivo, a quién pertenece y si sigue vigente, acabarás lanzando bugs y filtrando datos.
Elige una estrategia de carpetas predecible y cúmplela. Muchos equipos organizan por tenant (empresa), luego por propósito y luego por fecha. Otros usan tenant, usuario, propósito. La elección exacta importa menos que la consistencia. Las fechas ayudan a que los directorios no crezcan sin límite y facilitan los jobs de limpieza.
Evita poner datos personales en rutas o nombres de archivo. No incrustes correos, nombres completos, números de factura o teléfonos. Usa IDs aleatorios en su lugar. Si necesitas buscar por significado humano, guarda eso en la metadata de la base de datos, no en la clave del objeto.
Mantén separados originales y derivados para que las reglas sean claras. Almacena el original una sola vez y guarda miniaturas o vistas previas bajo un prefijo distinto. Así es más fácil aplicar políticas de retención y permisos diferentes (una vista previa puede permitirse mostrarse en más sitios que el original).
Un enfoque de nombrado simple y duradero:
- Particiona por tenant ID (o workspace ID)
- Añade un prefijo de propósito (avatars, invoices, attachments)
- Añade un bucket temporal por fecha (YYYY/MM)
- Usa un ID de archivo opaco como nombre de archivo
- Almacena derivados bajo un prefijo separado (previews, thumbnails)
Decide cómo manejarás versiones. Si los usuarios pueden reemplazar archivos, o bien sobrescribes la misma clave de objeto (simple, sin historial) o creas una nueva versión y marcas la antigua como inactiva (más amigable para auditoría). Muchos equipos guardan historial para documentos de cumplimiento y sobrescriben para fotos de perfil.
Escribe tus reglas de nombrado. En AppMaster, trátalo como cualquier convención compartida: colócalo en la documentación del proyecto para que la lógica backend, los constructores de UI y futuras integraciones generen las mismas rutas.
Patrones de permisos y control de acceso
Con subidas de archivos a gran escala, los atajos en permisos se convierten en incidentes graves. Empieza con deny-by-default: cada archivo subido es privado hasta que una regla permita explícitamente el acceso.
Ayuda separar dos preguntas: quién puede ver el registro y quién puede obtener los bytes. No son lo mismo. Muchas aplicaciones deberían permitir ver metadata (nombre del archivo, tamaño, fecha de subida) sin permitir descargar el archivo.
Patrones de acceso comunes
Elige un patrón primario por tipo de archivo y añade excepciones con cuidado:
- Solo propietario: solo el uploader (y cuentas de servicio) pueden descargar.
- Basado en equipo: miembros del workspace/proyecto pueden descargar.
- Basado en roles: roles como Finanzas o RRHH pueden descargar a través de equipos.
- Compartir por enlace: un token especial concede descarga, normalmente con expiración y alcance.
Los casos límite necesitan reglas claras, no soluciones puntuales. Decide cómo trabajan los admins (acceso global o solo ciertas categorías), cómo obtiene soporte acceso temporal (con límite de tiempo y registrado) y qué ocurre cuando un usuario se elimina (conservar archivos por cumplimiento, reasignar propiedad o borrar).
Trata metadata y descargas por separado
Un patrón simple son dos comprobaciones: (1) ¿puede el usuario leer el registro de subida?, (2) ¿puede el usuario solicitar una respuesta de descarga? Esa segunda comprobación es donde aplicas “privado salvo que se permita”, incluso si alguien adivina un ID.
Para documentos sensibles, registra los accesos. Como mínimo, guarda quién descargó (ID de usuario y rol), qué descargó (ID de archivo y tipo), cuándo ocurrió (timestamp), por qué se permitió (resultado de política, token de compartido, override de admin) y desde dónde vino (IP o dispositivo, si aplica).
En AppMaster, estas reglas suelen vivir en el Business Process Editor: un flujo para listar metadata de subida y otro más estricto para generar una respuesta de descarga.
Enlaces de descarga que expiran: descargas más seguras sin fricción
Los enlaces de descarga con expiración son un buen punto intermedio entre “cualquiera con la URL puede descargar para siempre” y “los usuarios deben iniciar sesión cada vez”. Funcionan bien para descargas puntuales, compartir un documento por email o dar acceso temporal a un contratista. A escala, también reducen issues de soporte porque puedes conceder acceso sin abrir todo tu almacenamiento.
Dos patrones comunes:
- Las Signed URLs expiran automáticamente. Son sencillas y rápidas, pero revocar es difícil si el enlace ya se difundió.
- Un endpoint de descarga basado en tokens te da más control. El enlace contiene un token corto, tu app comprueba permisos en cada petición y entonces sirve o redirige al archivo.
Una configuración práctica:
- Usa expiraciones cortas para enlaces compartidos (10 a 60 minutos) y renovarlos bajo demanda.
- Conserva expiraciones más largas solo para sesiones autenticadas y de confianza (por ejemplo, “Descargar de nuevo” genera un nuevo enlace).
- Restringe los enlaces: un archivo, un usuario (o destinatario), una acción (ver vs descargar).
- Registra la creación y el uso del enlace para poder rastrear fugas sin adivinar.
El alcance importa porque ver suele implicar visualización inline, mientras que descargar implica guardar una copia. Si necesitas ambos, crea enlaces separados con reglas distintas.
Planifica la revocación. Si un usuario pierde acceso (reembolso, cambio de rol, fin de contrato), las signed URLs por sí solas pueden no ser suficientes. Con un endpoint de tokens, puedes invalidar tokens de inmediato. Con signed URLs, mantén expiraciones cortas y rota claves de firma solo cuando sea necesario (la rotación de claves revoca todo, úsala con cuidado).
Ejemplo: un enlace a una factura en el portal de clientes enviado por email a un contable expira en 30 minutos, permite solo ver y está ligado a ese ID de factura y a la cuenta del cliente. Si el cliente se elimina de la cuenta, el token se rechaza aunque el email se reenvíe.
Paso a paso: un flujo de subida escalable
Un flujo de subida fiable separa tres preocupaciones: qué permites, dónde van los bytes y quién puede recuperarlos después. Cuando eso se mezcla, los pequeños casos límite se convierten en incidentes en producción.
Un flujo práctico para imágenes, PDFs y la mayoría de archivos generados por usuarios:
- Define reglas por propósito. Para cada propósito (avatar, invoice, ID document) establece tipos permitidos, tamaño máximo y comprobaciones extra como máximo de páginas.
- Crea una petición de subida en tu backend. El cliente pide permiso para subir. El backend devuelve un objetivo de subida (por ejemplo, una clave de objeto y un token de corta duración) y crea una nueva fila de subida con
pending. - Sube los bytes al almacenamiento y confirma. El cliente sube al object storage y luego llama a tu backend para confirmar la finalización. El backend verifica la clave esperada y propiedades básicas y marca la fila como
uploaded. - Ejecuta verificación asíncrona. En background, verifica el tipo real de archivo (ideally incluyendo magic bytes), aplica límites de tamaño, extrae metadata segura (dimensiones, número de páginas) y opcionalmente ejecuta detección de malware. Si falla, marca la subida
blockede impide descargas. - Sirve descargas según la política. Al descargar, verifica que el usuario tenga acceso a la entidad propietaria del archivo (usuario, org, ticket, pedido). Luego proxea la descarga o devuelve enlaces de descarga con expiración para mantener privado el almacenamiento.
Añade limpieza. Borra pending abandonados tras una ventana corta y elimina archivos sin referencia (por ejemplo, un usuario subió una imagen pero nunca guardó el formulario).
Si construyes esto en AppMaster, modela las subidas como su propia entidad con un campo de status y referencias de propietario, y aplica las mismas comprobaciones de permiso en cada Business Process de descarga.
Ejemplo: facturas en un portal de clientes
Un portal donde los usuarios suben facturas en PDF suena simple hasta que tienes miles de empresas, múltiples roles y la misma factura reemplazada tres veces.
Para organización de almacenamiento, guarda el archivo crudo en una ruta predecible que coincida con cómo la gente busca. Por ejemplo: invoices/<company_id>/<yyyy-mm>/<upload_id>.pdf. La empresa y el mes facilitan la limpieza y los informes, mientras que upload_id evita colisiones cuando dos archivos comparten nombre.
En la base de datos, almacena metadata que explique qué es el archivo y quién puede acceder:
company_idybilling_monthuploaded_by_user_idyuploaded_atoriginal_filenameycontent_typesize_bytesy checksum (opcional)- estado (active, replaced, quarantined)
Ahora el compartir: un manager de facturación quiere enviar una factura a un contable externo por 24 horas. En lugar de cambiar permisos globales, genera un enlace de descarga que expira ligado a esa factura concreta, con un tiempo de caducidad estricto y un único propósito (solo descarga). Cuando el contable hace clic, tu app verifica el token, confirma que no ha expirado y sirve el archivo.
Si un usuario sube el PDF equivocado o reemplaza un archivo, no sobrescribas el objeto anterior. Marca el registro previo como replaced, consérvalo para auditoría y apunta la entrada de la factura al nuevo upload_id. Si necesitas respetar reglas de retención, puedes borrar archivos reemplazados más tarde con un job programado.
Cuando soporte recibe un ticket de “no se puede descargar”, la metadata ayuda a diagnosticar rápido: ¿está el enlace expirado?, ¿la factura está marcada como reemplazada?, ¿pertenece el usuario a la empresa correcta?, o ¿el archivo está puesto en cuarentena? En AppMaster, estas comprobaciones pueden vivir en un Business Process para que cada descarga siga las mismas reglas.
Errores comunes y cómo evitarlos
Cuando los equipos empiezan a manejar subidas de archivos a escala, los bugs raramente son misteriosos. Provienen de atajos previsibles que funcionan en una demo y dañan después.
- Confiar solo en la extensión o solo en el tipo MIME. Los atacantes pueden renombrar archivos y los navegadores pueden mentir. Comprueba ambos y además verifica magic bytes en el servidor.
- Usar almacenamiento público y confiar en que los permisos bastan. Un bucket/container público convierte cualquier regla fallida en una fuga de datos. Mantén el almacenamiento privado por defecto y palanquea el acceso a través de tu app.
- Poner nombres proporcionados por usuarios en rutas o URLs. Nombres como invoice_john_smith.pdf filtran información personal y facilitan adivinar. Usa IDs aleatorios para claves de objeto y almacena el nombre para mostrar en metadata.
- Mezclar archivos de distintos tenants en la misma ruta sin comprobaciones fuertes. Una ruta como /uploads/2026/01/ no es un modelo de permisos. Verifica siempre tenant y derechos de usuario antes de devolver una descarga.
- Omitir limpieza de subidas fallidas o abandonadas. Las subidas multipart y reintentos dejan basura. Añade un job en background que elimine subidas
pendingque nunca se completaron.
Un error que olvidan es no tener plan para reintentos y duplicados. Las redes móviles fallan. Los usuarios tocan dos veces. Tu sistema debería tratar “subir el mismo archivo otra vez” como comportamiento normal.
Un enfoque práctico es generar un ID de subida primero, luego aceptar chunks o un único archivo y marcar el registro como verificado solo tras pasar la validación. Si la misma subida se repite, devuelve el registro existente en vez de crear una copia adicional.
Si construyes esto en AppMaster, mantén las reglas centrales en un solo lugar (lógica backend) para que web y móvil se comporten igual, incluso si cambia la UI.
Checklist rápido antes de lanzar
Antes de abrir subidas a usuarios reales, repasa lo básico. La mayoría de problemas con subidas a escala vienen de pequeñas lagunas que solo se ven con muchos usuarios, muchos archivos y muchos casos límite.
- Allowlist de tipos y límites de tamaño por caso de uso (avatares vs facturas). Valida extensión y contenido real.
- Guarda metadata de subida en la base de datos: quién lo posee (usuario, equipo, cuenta), para qué sirve y un estado claro como
pending,verifiedoblocked. - Mantén el almacenamiento privado por defecto y aplica comprobaciones de permiso en cada descarga (no confíes en URLs ocultas).
- Usa enlaces de descarga que expiren cuando sea necesario compartir y mantén tiempos cortos (minutos u horas, no días).
- Evita datos personales en rutas y nombres de archivo. Usa IDs aleatorios y muestra un nombre amigable en la UI.
Ten una respuesta para subidas abandonadas. Es normal que los usuarios empiecen una subida y no la terminen, o que reemplacen archivos a menudo.
Un plan de limpieza simple:
- Borra archivos huérfanos que no llegaron a
verifiedtras un tiempo. - Mantén una ventana de retención para archivos reemplazados y luego elimínalos.
- Registra eventos clave (subida, validación, descarga, borrado) para que soporte pueda investigar.
Si usas AppMaster, almacena metadata en PostgreSQL vía Data Designer, aplica comprobaciones en Business Process Editor y genera tokens de descarga de corta duración antes de servir archivos.
Próximos pasos: lanzar de forma segura y mejorar poco a poco
La forma más rápida de llegar a un lanzamiento seguro es elegir un enfoque de subida y mantenerlo. Decide si los archivos pasan primero por tu backend o si suben directamente a object storage con un token de corta duración. Luego escribe los pasos exactos y quién es responsable de cada uno (cliente, backend, almacenamiento). La consistencia vence a la sofisticación cuando tratas con subidas a escala.
Empieza con valores por defecto estrictos. Limita tipos a lo que realmente necesitas, mantén límites de tamaño conservadores y requiere autenticación para todo lo que no deba ser público. Si los usuarios piden archivos más grandes o más formatos, afloja una regla a la vez y mide el impacto.
Añade monitoreo básico pronto para que los problemas aparezcan rápidamente:
- Tasa de fallos de subida (por dispositivo, navegador y tipo de archivo)
- Tamaño promedio y p95 de subidas
- Tiempo de subida (especialmente en redes móviles)
- Crecimiento de almacenamiento por día o semana
- Errores de descarga (incluyendo enlaces expirados o permisos denegados)
Si este sistema de subidas forma parte de una app mayor, mantiene el modelo de datos y permisos cerca de la lógica de negocio. Los equipos que usan AppMaster suelen poner registros de subida en PostgreSQL, implementar validación y control de acceso en Business Processes y reutilizar la misma lógica entre backend, web y apps nativas.
Una mejora útil siguiente es añadir vistas previas para formatos comunes, registros de auditoría para documentos sensibles o reglas simples de retención (por ejemplo, eliminar subidas temporales tras 30 días). Pequeñas mejoras constantes mantienen el sistema fiable conforme crece su uso.
FAQ
Empieza por anotar las categorías reales que esperas: avatares, facturas, contratos, adjuntos de tickets, exportaciones, etc. Para cada categoría, decide quién puede subir, quién puede ver, quién puede reemplazar o eliminar, si el compartir debe expirar y cuánto tiempo se conserva. Esas decisiones guían tu modelo de datos y las comprobaciones de permisos, para que no tengas que rehacerlo todo más tarde.
Usa una allowlist y comprueba tanto la extensión del nombre de archivo como el tipo MIME detectado a partir del contenido. Define límites claros de tamaño según el propósito del archivo y añade comprobaciones más profundas cuando importe (por ejemplo, dimensiones de imagen o número de páginas en PDFs). Renombra archivos a un ID generado y guarda el nombre original en la metadata para evitar colisiones y nombres inseguros.
Las extensiones se pueden falsificar fácilmente y los tipos MIME pueden variar según dispositivo y navegador. Comprobar ambos atrapa muchos intentos de suplantación, pero para cargas de mayor riesgo también debes verificar la firma del archivo (magic bytes) en el servidor durante la verificación. Trata cualquier fallo como bloqueado e impide descargas hasta que se revise o elimine.
Crea primero el registro en la base de datos y devuelve un ID de subida; después sube los bytes y confirma la finalización. Esto evita “archivos misteriosos” en el bucket sin dueño ni propósito, y te permite aplicar permisos antes de que se muevan los datos. También facilita la limpieza porque puedes localizar subidas pendientes abandonadas de forma fiable.
Mantén el almacenamiento privado por defecto y controla el acceso desde la lógica de permisos de tu aplicación. Usa claves de objeto predecibles pero sin datos personales: combina el ID del inquilino o workspace con un ID opaco de subida, y guarda los detalles legibles para humanos en la base de datos. Separa originales de derivados (miniaturas, vistas previas) para aplicar distintas políticas de retención y permisos.
Trata el acceso a la metadata y las descargas de forma separada. Muchas personas pueden ver que un archivo existe sin poder descargarlo. Aplica siempre una regla deny-by-default para descargas, registra accesos en documentos sensibles y evita depender de una “URL difícil de adivinar” como control principal de seguridad.
Las signed URLs son rápidas y simples, pero una vez compartidas difícilmente se revocan hasta que expiran. Un endpoint de descarga basado en tokens permite comprobar permisos en cada petición y revocar accesos invalidando tokens. En la práctica, expiraciones cortas combinadas con un alcance limitado a un archivo y una acción reducen el riesgo sin añadir mucha fricción.
Diseña el sistema esperando reintentos: las conexiones móviles fallan, los usuarios tocan dos veces y las subidas se duplican. Genera primero un ID de subida, acepta la carga contra ese ID y haz que el paso de confirmación sea idempotente para que repetirlo no cree copias extra. Si quieres reducir duplicados, guarda un checksum después de la subida e identifica re-subidas del mismo contenido para el mismo propósito.
Las subidas pendientes se acumulan cuando los usuarios abandonan un formulario o pierden la conexión, así que programa limpieza desde el día uno. Expira y borra registros pendientes antiguos y sus objetos en almacenamiento; conserva elementos bloqueados solo el tiempo necesario para investigar. Para documentos reemplazados, guarda una ventana de retención por auditoría y luego elimina las versiones antiguas automáticamente.
Modela las subidas como una entidad en PostgreSQL con campos de estado, propietario, ámbito y propósito, y aplica las reglas en un único flujo backend para que web y móvil se comporten igual. Pon la validación y los pasos de verificación en un Business Process para que todos los caminos de subida apliquen la misma allowlist, límites y transiciones de estado. Sirve descargas mediante un Business Process más estricto que verifique permisos y emita tokens de descarga de corta duración cuando se necesite compartir.


