Cómo añadir subida de archivos a tu app: almacenamiento, límites y seguridad
Para añadir subida de archivos a tu app, guarda los archivos en almacenamiento de objetos (un bucket), no en el disco de tu servidor ni en la base de datos, y guarda en la base de datos un pequeño registro con la clave del archivo, el nombre, el tamaño, el tipo y el propietario. Comprueba el tamaño y el tipo del archivo en el servidor, decide desde el principio si los archivos son públicos (como las fotos de producto) o privados (como las facturas), y sirve los privados solo después de comprobar quién los pide. En un creador de apps con IA puedes describir la función de subida en un solo prompt; lo importante es probar que los archivos sobreviven a un redespliegue y que no pueden abrirlos las personas equivocadas.
Decide qué tipo de subidas necesitas
Antes de construir, responde a tres preguntas:
- ¿Qué archivos? Fotos de perfil, imágenes de producto, PDF, hojas de cálculo, audio, vídeo. Esto decide los límites de tipo y de tamaño.
- ¿Quién puede verlos? Todo el mundo (una galería pública) o solo quien los subió y los administradores (contratos, documentos de identidad, archivos de clientes).
- ¿Qué pasa después de subirlos? Solo guardarlos, mostrar una vista previa, redimensionar imágenes o leer su contenido.
Las imágenes públicas y los documentos privados necesitan configuraciones distintas, así que decide esto primero.
Dónde deben vivir los archivos
| Opción | Cómo funciona | Ideal para | Cuidado con |
|---|---|---|---|
| Almacenamiento de objetos (bucket) | Archivos guardados en un servicio diseñado para ello; tu base de datos guarda una clave o una URL | Casi cualquier app | Las reglas de acceso deben configurarse correctamente |
| Almacenamiento proporcionado por la plataforma | Tu creador de apps o tu host activa un bucket por ti | Apps creadas en esa plataforma | Los límites y los precios siguen a la plataforma |
| Disco del servidor | Archivos escritos en el sistema de archivos del servidor de la app | Solo desarrollo local | A menudo se borra al reiniciar o redesplegar |
| En la base de datos | Los bytes del archivo guardados en una tabla | Casi nunca | Hincha la base de datos y ralentiza las copias de seguridad |
| Widget de subida de terceros | Un servicio de subida alojado gestiona todo el flujo | Medios pesados, transformaciones de imagen | Otro proveedor, otra cuenta y otra factura |
Para la mayoría de las apps, el almacenamiento de objetos más un registro en la base de datos es la respuesta correcta. La fila de la base de datos es lo que consulta tu app («muestra los documentos de este usuario»); el bucket solo guarda los bytes.
Archivos públicos frente a privados
- Los archivos públicos (fotos de producto, imágenes de blog, avatares) pueden servirse desde una URL pública. Cualquiera con el enlace puede abrirlos, lo cual es correcto para este tipo de contenido.
- Los archivos privados (facturas, contratos, documentos médicos o de identidad, entregables de clientes) nunca deben tener una URL pública adivinable. El servidor comprueba que el usuario conectado es propietario del archivo o tiene permiso, y luego lo devuelve en streaming o devuelve una URL firmada: un enlace que solo funciona durante un tiempo limitado.
Un error habitual y grave es guardar archivos privados en un bucket público con nombres predecibles. Cualquiera que adivine /uploads/factura-102.pdf obtiene la factura de otra persona.
Prompts de ejemplo
Subida de una imagen pública:
Permite que los administradores suban hasta 5 fotos de producto por producto. Acepta JPG, PNG y WebP de hasta 5 MB cada una. Guarda los archivos en el almacenamiento de archivos, guarda la clave, el tamaño y el orden de cada archivo en una tabla product_images, y muestra miniaturas con un botón para eliminar. Valida el tipo y el tamaño en el servidor, no solo en el navegador.
Subida de un documento privado:
Añade una página de Documentos para clientes conectados. Los clientes pueden subir PDF de hasta 20 MB. Los archivos son privados: guárdalos en el almacenamiento de archivos, guarda el ID del propietario, el nombre original, el tamaño y la hora de subida en una tabla documents, y solo permite descargarlos al propietario y a los administradores. Las descargas pasan por una ruta del servidor que comprueba el permiso. Nunca expongas una URL pública para estos archivos.
Mejoras útiles:
Muestra una barra de progreso durante la subida y un error claro si el archivo es demasiado grande o de un tipo incorrecto.
Cuando se borre un registro de documento, borra también el archivo almacenado.
Paso a paso
- Elige los tipos y los límites de tamaño de cada campo de subida. Sé concreto: «PDF de hasta 20 MB», no «documentos».
- Activa el almacenamiento. En un creador con IA, pide las subidas en el chat y él lo configurará; en otros sitios, crea un bucket y añade sus credenciales como secretos del servidor.
- Crea una tabla en la base de datos para los registros de archivos: ID, propietario, clave de almacenamiento, nombre original, tipo, tamaño, fecha de creación.
- Construye la ruta de subida en el servidor: comprueba que el usuario ha iniciado sesión, comprueba el tipo y el tamaño, genera una clave de almacenamiento segura (no el nombre del usuario), guarda el archivo e inserta el registro.
- Construye la ruta de descarga o de visualización: URL pública para los archivos públicos; una ruta con comprobación de permisos o una URL firmada para los privados.
- Construye la interfaz: selector de archivos, arrastrar y soltar si es útil, progreso, vistas previas, errores.
- Gestiona los borrados para que eliminar un registro también elimine el archivo almacenado.
- Prueba: sube, recarga, redespliega o publica, y comprueba que el archivo sigue cargando. Luego entra con otro usuario e intenta abrir el archivo privado del primero.
Errores habituales
- Escribir las subidas en el disco del servidor. Funciona en desarrollo, y luego los archivos desaparecen tras un reinicio o un redespliegue.
- Confiar en las comprobaciones del navegador. El atributo «accept» de un campo de archivo es una pista, no seguridad. Comprueba el tipo y el tamaño en el servidor.
- Usar el nombre de archivo del usuario como clave de almacenamiento. Los nombres chocan entre sí y pueden contener caracteres raros. Genera una clave única y guarda el nombre original por separado.
- Buckets públicos para archivos privados. Lo de arriba; este es el que acaba en las noticias.
- Permitir cualquier tipo de archivo. Los archivos HTML o SVG servidos desde tu dominio pueden ejecutar scripts en algunas configuraciones. Acepta solo los tipos que necesitas.
- No poner límite de tamaño. Una sola subida enorme puede agotar tu espacio o hacer que la petición caduque.
- Archivos huérfanos. Borrar la fila de la base de datos sin borrar el archivo llena poco a poco un almacenamiento que estás pagando.
- Olvidar el móvil. Las fotos del teléfono pueden ser grandes y estar en formatos como HEIC; decide si los aceptas o los conviertes.
Lista de comprobación
- Los archivos van a almacenamiento de objetos, no al disco del servidor ni a la base de datos
- Cada archivo tiene un registro en la base de datos con propietario, clave, nombre, tipo y tamaño
- El tipo y el tamaño se comprueban en el servidor
- Las claves de almacenamiento se generan, no se toman del nombre del archivo
- Los archivos privados solo se sirven tras una comprobación de permisos
- Otro usuario no puede abrir tus archivos privados, ni siquiera con el enlace
- Borrar un registro borra el archivo
- Los archivos siguen cargando tras publicar o redesplegar
- Los errores de subida se muestran con claridad, también en el móvil
Subida de archivos en Mythex
Mythex puede activar el almacenamiento de archivos de un proyecto automáticamente cuando tu app necesita subidas, así que no tienes que aprovisionar un bucket a mano. También puedes escribir /storage en el chat. Está disponible en Free y en Pro, con un límite de 1 GB en Free, y puedes ver su estado en Ajustes → Storage.
La documentación indica claramente que el alojamiento publicado no es un sistema de archivos local duradero, así que pide al agente que use el almacenamiento de la plataforma en lugar de guardar en disco. Los archivos almacenados y las descargas se pagan con tu saldo de créditos, según el tamaño y la cantidad descargada; Pro paga la mitad de la tarifa de Free. Consulta File storage en la documentación.
Las subidas suelen ir de la mano de una base de datos para los registros de archivos y del inicio de sesión para los archivos privados. Si estás construyendo un espacio donde los clientes intercambian documentos, consulta cómo crear un portal de clientes, y repasa la lista de seguridad antes del lanzamiento.
Preguntas
¿Dónde deben guardarse los archivos subidos?
En almacenamiento de objetos (un servicio diseñado para archivos, a menudo llamado bucket), no en el disco del servidor de la app ni dentro de la base de datos. En tu base de datos guarda solo la clave o la URL del archivo, además de datos como el nombre, el tamaño y el propietario.
¿Por qué desaparecen mis archivos subidos tras publicar o redesplegar?
La mayoría de las plataformas de alojamiento no conservan un disco local duradero: cuando la app se reinicia o se vuelve a desplegar, los archivos escritos en su disco se pierden. Guarda las subidas en almacenamiento de objetos.
¿Cómo mantengo privados los archivos subidos?
No los hagas legibles públicamente. Haz que tu servidor compruebe que el usuario conectado tiene permiso para ver un archivo y luego se lo envíe o le devuelva un enlace firmado de corta duración.
¿Admite Mythex la subida de archivos?
Sí. Mythex puede activar el almacenamiento de archivos para un proyecto cuando la app necesita subidas, en Free y Pro, con un límite de 1 GB en Free. Pides al agente la función de subida o escribes /storage.