Subir archivos a Amazon S3 con Node.js, Express y AWS SDK v3

Aprende a subir archivos a Amazon S3 usando Node.js, Express y AWS SDK v3. Tutorial paso a paso con ejemplos de código. Crea una API escalable.

miércoles, 29 de julio de 2026 • 7 min de lectura • Equipo Q2BSTUDIO

Guía paso a paso para crear una API de carga de archivos con Node.js y S3

En el ecosistema digital actual, la gestión de archivos es un componente crítico de casi cualquier aplicación web moderna. Ya sea para subir imágenes de perfil, documentos PDF, facturas o archivos multimedia, necesitamos una solución que sea escalable, segura y eficiente. Almacenar estos archivos directamente en el servidor de la aplicación puede generar cuellos de botella, costos impredecibles y riesgos de pérdida de datos. Aquí es donde entra Amazon S3 (Simple Storage Service), un servicio de almacenamiento de objetos ofrecido por AWS que proporciona durabilidad del 99.999999999% y escalabilidad prácticamente ilimitada.

En este artículo te mostraremos cómo construir una API REST sencilla pero robusta para subir archivos directamente a un bucket de Amazon S3 utilizando Node.js, Express, Multer y AWS SDK v3. Además, exploraremos buenas prácticas de seguridad, integración con servicios cloud y cómo empresas como Q2BSTUDIO implementan soluciones de este tipo en proyectos de aplicaciones a medida para sus clientes.

Este tutorial está pensado tanto para desarrolladores que se inician en AWS como para aquellos que buscan optimizar sus procesos de subida de archivos. A lo largo del texto haremos referencias a conceptos como la ciberseguridad, la inteligencia artificial (IA), los agentes IA y la Business Intelligence (BI) con Power BI, todos ellos servicios que en Q2BSTUDIO integramos de forma natural en nuestros desarrollos.

Antes de comenzar, asegúrate de tener Node.js 18 o superior, una cuenta de AWS activa, un bucket de S3 creado y un usuario IAM con acceso programático (Access Key ID y Secret Access Key). Si aún no tienes experiencia con AWS, no te preocupes: te guiaremos paso a paso.

Paso 1: Creación del proyecto

Abre tu terminal y ejecuta los siguientes comandos para crear un nuevo proyecto e instalar las dependencias necesarias:

mkdir s3-upload-apicd s3-upload-apinpm init -ynpm install express multer dotenv uuid @aws-sdk/client-s3

Los paquetes instalados son: Express como framework web, Multer para manejar la carga de archivos (en memoria), dotenv para variables de entorno, uuid para generar nombres únicos y el SDK v3 de AWS para interactuar con S3.

Paso 2: Variables de entorno

Crearemos un archivo .env con la configuración de nuestra cuenta AWS y el bucket. Recuerda reemplazar los valores con tus propias credenciales. Es fundamental no subir este archivo a repositorios públicos; por eso crearemos también un .gitignore que excluya node_modules y .env.

AWS_REGION=us-east-1AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EJEMPLOAWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEJEMPLOAWS_BUCKET_NAME=mi-bucket-uploadsPORT=3000

En Q2BSTUDIO siempre recomendamos gestionar las credenciales de forma segura, usando servicios como AWS Secrets Manager o Azure Key Vault cuando se pasa a producción. Esto forma parte de nuestras prácticas de ciberseguridad.

Paso 3: Configurar el cliente S3

En el archivo principal de la aplicación (por ejemplo index.js), importamos el módulo S3Client y lo inicializamos con las credenciales:

import { S3Client } from '@aws-sdk/client-s3';const s3 = new S3Client({ region: process.env.AWS_REGION, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, },});

Esta configuración es válida tanto para buckets en AWS como para entornos multicloud (Azure/AWS) que manejamos en Q2BSTUDIO, donde aprovechamos las fortalezas de cada plataforma.

Paso 4: Configurar Multer con almacenamiento en memoria

Multer es un middleware de Node.js para manejar la subida de archivos. Usaremos memoryStorage() para que el archivo se cargue en un buffer y podamos enviarlo directamente a S3 sin almacenarlo temporalmente en el disco del servidor:

import multer from 'multer';const upload = multer({ storage: multer.memoryStorage() });

Este enfoque es ideal para APIs que escalan, ya que evita escrituras locales y reduce la latencia. Además, es compatible con arquitecturas serverless como AWS Lambda o Azure Functions, servicios que ofrecemos como parte de nuestras soluciones cloud.

Paso 5: Crear el endpoint de subida

Ahora definiremos una ruta POST que reciba un archivo, genere un nombre único con UUID y lo suba al bucket usando el comando PutObject:

import { PutObjectCommand } from '@aws-sdk/client-s3';import { v4 as uuid } from 'uuid';

app.post('/upload', upload.single('file'), async (req, res) => { try { const filename = `${uuid()}-${req.file.originalname}`; await s3.send(new PutObjectCommand({ Bucket: process.env.AWS_BUCKET_NAME, Key: filename, Body: req.file.buffer, ContentType: req.file.mimetype, })); res.json({ success: true, filename }); } catch (error) { console.error(error); res.status(500).json({ success: false, message: 'Upload failed' }); }});

Este código maneja errores básicos, pero en un entorno de producción deberíamos añadir validaciones de tipo de archivo, tamaño máximo y autenticación. En Q2BSTUDIO, cuando desarrollamos aplicaciones a medida, incluimos capas de seguridad adicionales como autenticación JWT y políticas de acceso basadas en roles.

Paso 6: Iniciar el servidor

Agrega el siguiente código para arrancar Express en el puerto configurado:

const express = require('express');const app = express();const PORT = process.env.PORT || 3000;app.listen(PORT, () => console.log(`Server running on port ${PORT}`));

Ejecuta npm start y tu API estará lista en https://localhost:3000.

Paso 7: Probar con Postman

Abre Postman e ingresa una solicitud POST a https://localhost:3000/upload. En Body, selecciona form-data, agrega una clave llamada file de tipo File y elige cualquier imagen o documento. Al enviar, obtendrás una respuesta como:

{ 'success': true, 'filename': '4c6ddcf2-profile.png' }

Verifica en tu consola de AWS S3 que el archivo aparece en el bucket.

Errores comunes y soluciones

Durante el desarrollo pueden aparecer errores como AccessDenied: significa que tu usuario IAM no tiene permiso para subir objetos. Asegúrate de adjuntar una política que incluya s3:PutObject. Otro error típico es NoSuchBucket: revisa el nombre del bucket y la región. Y si ves InvalidAccessKeyId, verifica tus credenciales. Estas prácticas de gestión de identidad son parte de la ciberseguridad que implementamos en Q2BSTUDIO para proteger los datos de nuestros clientes.

Mejoras y próximos pasos

Una vez que la subida básica funciona, puedes extender la API con funcionalidades adicionales:

Subida múltiple de archivos

Modifica Multer para aceptar varios archivos con upload.array('files', maxCount) y procesa cada uno en un bucle.

URLs prefirmadas (Pre-signed URLs)

Genera URLs temporales para que los usuarios puedan subir archivos directamente desde el frontend sin exponer tus credenciales. Esto es útil en aplicaciones con React o Angular, y lo combinamos con servicios de IA para clasificar automáticamente los documentos subidos.

Validación de tipo y tamaño

Implementa un middleware personalizado que rechace archivos con extensiones peligrosas o que excedan un límite (por ejemplo, 10 MB). Esto es esencial para la ciberseguridad y para evitar sobrecostos en S3.

Integración con frontend

Conecta esta API a una aplicación React usando fetch o Axios. En Q2BSTUDIO desarrollamos aplicaciones a medida con stacks modernos como React, Vue o Angular, siempre sincronizados con el backend.

Uso de CloudFront para distribución global

Para acelerar la entrega de archivos estáticos, puedes colocar CloudFront delante de tu bucket S3. Esto reduce la latencia y mejora la experiencia del usuario, especialmente si tu audiencia está distribuida geográficamente.

Organización en carpetas

Puedes estructurar los objetos en S3 usando prefijos (por ejemplo, usuarios/{id}/imagenes/) para facilitar la gestión y la aplicación de políticas de ciclo de vida.

Casos de uso empresarial y el valor de Q2BSTUDIO

En Q2BSTUDIO hemos ayudado a numerosas empresas a implementar sistemas de gestión documental basados en S3, combinados con Business Intelligence con Power BI para analizar patrones de uso, y con agentes IA que procesan automáticamente los archivos subidos (extracción de datos, clasificación, etc.). Por ejemplo, una aseguradora puede subir partes de accidentes, y un agente IA extrae la información clave y la envía a un dashboard de Power BI para su análisis.

Nuestro equipo de expertos en cloud (AWS y Azure) diseña arquitecturas escalables y seguras, adaptadas a las necesidades específicas de cada proyecto. Ya sea que necesites una API simple de subida de archivos o un sistema complejo de procesamiento con inteligencia artificial, en Q2BSTUDIO ofrecemos servicios de desarrollo de software a medida que integran estas tecnologías de manera natural.

Conclusión

Construir una API de subida de archivos con Node.js y Amazon S3 es un proceso directo una vez que comprendes el flujo básico: el cliente envía el archivo, Multer lo captura en memoria, y el SDK de AWS lo transfiere al bucket. Este enfoque es escalable, seguro y te prepara para integrar funcionalidades avanzadas como pre-signed URLs, validaciones y automatizaciones con IA.

La clave está en no limitarse a la subida simple: piensa en cómo tu aplicación manejará los archivos después de subirlos. La inteligencia artificial y la automatización pueden transformar un simple repositorio en un motor de negocio. En Q2BSTUDIO estamos listos para ayudarte a dar ese salto. ¿Hablamos de tu próximo proyecto?

¿UNA PAUSA?

Juega un momento antes de irte

NUESTROS SERVICIOS

Cómo podemos ayudarte

¿Tienes un proyecto en mente?

Cuéntanos tu visión y la convertimos en una solución de software. Sea cual sea el alcance, hacemos realidad tu idea.