Subidas de archivos y object storage
El object storage almacena objetos por clave, no como un sistema de archivos local compartido. En despliegues con varias instancias o serverless, guardar en el disco del proceso suele ser temporal y no está disponible para los demás servidores.
Carga directa con URL firmada
Sección titulada «Carga directa con URL firmada»1. Cliente solicita permiso y metadatos al backend.2. Backend autoriza, crea una clave no predecible y firma una URL limitada.3. Cliente sube directamente al almacenamiento.4. Backend confirma o recibe un evento, valida y marca el archivo disponible.La URL debe limitar método, clave, tamaño aproximado, tipo permitido y expiración. El cliente no decide una ruta pública arbitraria.
const objectKey = `${tenantId}/${crypto.randomUUID()}`const upload = await storage.createSignedUpload({ key: objectKey, expiresInSeconds: 300, contentType: "image/png"})Validación por capas
Sección titulada «Validación por capas»- Límite de bytes antes y durante la lectura.
- Tipo real mediante firma o decodificación, no solo extensión.
- Dimensiones, páginas o duración máximas.
- Nombre original tratado como metadato, nunca como ruta.
- Escaneo y procesamiento en cuarentena.
- Re-encode de imágenes cuando corresponda.
No sirvas HTML, SVG u otros contenidos activos desde el mismo origen de la aplicación sin una política explícita. Usa otro dominio, Content-Disposition: attachment y headers apropiados.
Autorización de descarga
Sección titulada «Autorización de descarga»Que una persona conozca la URL no significa que tenga permiso. Para objetos privados, el backend autoriza y entrega una URL de descarga de corta duración. Registra propietario, tenant, estado, hash, tamaño y política de retención en la base de datos.
Limpieza
Sección titulada «Limpieza»Programa la eliminación de cargas incompletas, versiones reemplazadas y archivos cuya retención terminó. La eliminación debe considerar copias, miniaturas, índices de IA y backups según la política del producto.