Multer

img

¿Qué es Multer?

Multer es un middleware de Node.js para manejar multipart/form-data, que es principalmente usado para subir archivos desde formularios HTML.

Diferencia clave:

A diferencia de otros middlewares como body-parser, que solo parsean datos JSON o URL-encoded, Multer está especializado en manejar archivos binarios y combinarlos con datos de formularios.

Funciona en conjunto con Express.js, integrándose fácilmente en rutas de API.

1. ¿Para qué se usa?

Se usa principalmente para subida de archivos al servidor: imágenes, documentos, videos, etc.

Contextos ideales:

Permite definir:

2. ¿Qué puedo construir con Multer?

3. ¿Cuándo es más conveniente usarlo?

Úsalo cuando:

Alternativas (como formidable o busboy) podrían ser más convenientes si:

Buenas prácticas recomendadas

const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, "uploads/"),
  filename: (req, file, cb) => cb(null, Date.now() + "-" + file.originalname),
});

Resumen rápido

✅ Fortalezas principales:

⚠️ Debilidades principales:

🛠️ Cuándo usarlo:

🚫 Cuándo evitarlo:


Temas


Conceptos relacionados

Antes de trabajar con Multer, es importante conocer algunos conceptos clave que te ayudarán a entender su funcionamiento e integración:

1. Express.js:

Framework de Node.js que permite crear aplicaciones y APIs de manera sencilla. Multer funciona como un middleware dentro de Express.

2. Middleware:

Funciones que se ejecutan entre la petición (request) y la respuesta (response) en Express. Multer es uno de estos middlewares.

3. multipart/form-data:

Tipo de codificación usado en formularios HTML para enviar archivos al servidor.

4. Request y Response (req/res):

Objetos de Express que representan la petición del cliente y la respuesta del servidor.

5. Almacenamiento (Storage Engine):

Configuración en Multer que define dónde y cómo se guardan los archivos subidos.

6. Validación de archivos:

Revisión de tipo MIME, tamaño y extensión antes de aceptar la subida.

7. Errores de subida:

Manejo de excepciones cuando un archivo excede los límites o no cumple con las reglas definidas.

8. Integración con servicios externos:

Como Amazon S3, Cloudinary o Firebase, cuando no se quiere almacenar en el servidor.

🔼 temas


Herramientas recomendadas

Para trabajar eficientemente con Multer, se recomienda combinarlo con ciertas herramientas y librerías:

Node.js + Express.js:

Entorno base para crear servidores y definir rutas donde se procesarán las subidas.

Nodemon:

Para reiniciar automáticamente el servidor durante el desarrollo.

Cloudinary / AWS S3 / Firebase Storage:

Servicios externos para almacenamiento en la nube de imágenes, videos o documentos.

Sharp:

Librería para procesar imágenes (cambio de tamaño, compresión, conversión de formatos).

dotenv:

Manejo de variables de entorno para almacenar claves de acceso y configuraciones seguras.

Joi o Zod:

Librerías para validar datos de entrada junto con los archivos subidos.

Helmet y cors:

Seguridad y control de accesos en aplicaciones Express que manejan archivos.

Postman o Thunder Client:

Herramientas para probar rutas de subida de archivos de manera sencilla.

Mongoose / Sequelize:

Si se requiere asociar los archivos subidos con registros en bases de datos MongoDB o SQL.

🔼 temas


Snippets rápidos

Fragmentos de código prácticos que suelen usarse con Multer:

1. Configuración básica de Multer

const multer = require("multer");
const upload = multer({ dest: "uploads/" });

2. Subir un solo archivo

app.post("/upload", upload.single("archivo"), (req, res) => {
  res.send("Archivo subido correctamente");
});

3. Subir múltiples archivos (mismo campo)

app.post("/uploads", upload.array("imagenes", 5), (req, res) => {
  res.send("Imágenes subidas correctamente");
});

4. Subir múltiples campos

app.post(
  "/profile",
  upload.fields([
    { name: "avatar", maxCount: 1 },
    { name: "docs", maxCount: 3 },
  ]),
  (req, res) => {
    res.send("Perfil con archivos subido");
  }
);

5. Almacenamiento personalizado con nombres únicos

const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, "uploads/"),
  filename: (req, file, cb) => cb(null, Date.now() + "-" + file.originalname),
});
const uploadCustom = multer({ storage });

🔼 temas


Comandos

Configuración básica (destino directo en carpeta):

const upload = multer({ dest: "uploads/" });

Subida de un solo archivo:

upload.single("campoDelArchivo");

Subida de varios archivos (mismo campo):

upload.array("campo", maxCantidad);

Subida de varios campos diferentes:

upload.fields([{ name: "campo1" }, { name: "campo2" }]);

Almacenamiento en disco con configuración personalizada:

const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, "uploads/"),
  filename: (req, file, cb) => cb(null, Date.now() + "-" + file.originalname),
});
const upload = multer({ storage });

Validación de tipo de archivo (ejemplo: solo imágenes):

const upload = multer({
  storage,
  fileFilter: (req, file, cb) => {
    if (file.mimetype.startsWith("image/")) cb(null, true);
    else cb(new Error("Solo se permiten imágenes"));
  },
});

Límite de tamaño máximo (ejemplo: 2MB):

const upload = multer({
  storage,
  limits: { fileSize: 2 * 1024 * 1024 },
});

🔼 temas


Conceptos Claves

🟢 Básico

1. ¿Qué es Multer y para qué se utiliza en Node.js?

Multer es un middleware de Node.js que permite manejar multipart/form-data, principalmente usado para subir archivos desde formularios HTML a un servidor Express.

2. ¿Cuál es la diferencia entre upload.single() y upload.array() en Multer?

3. ¿Qué tipos de almacenamiento soporta Multer?

Multer soporta almacenamiento en disco (diskStorage) y en memoria (memoryStorage), permitiendo guardar archivos en el servidor o procesarlos directamente en memoria.

4. ¿Cómo validar el tipo de archivo en Multer?

Usando la opción fileFilter en la configuración de Multer. Por ejemplo, para aceptar solo imágenes:

fileFilter: (req, file, cb) => {
  if (file.mimetype.startsWith("image/")) cb(null, true);
  else cb(new Error("Solo imágenes"));
};

5. ¿Cómo limitar el tamaño máximo de los archivos?

Usando la opción limits:

limits: {
  fileSize: 2 * 1024 * 1024;
} // 2MB

🟡 Intermedio

6. ¿Qué es diskStorage y cómo se configura?

diskStorage permite definir dónde se guardan los archivos y cómo se nombran:

const storage = multer.diskStorage({
  destination: (req, file, cb) => cb(null, "uploads/"),
  filename: (req, file, cb) => cb(null, Date.now() + "-" + file.originalname),
});

7. ¿Cuándo es recomendable usar memoryStorage?

Cuando se necesita procesar los archivos en memoria antes de enviarlos a un servicio externo (por ejemplo, redimensionar imágenes antes de subir a la nube).

8. ¿Cómo manejar errores de Multer en Express?

Capturando errores en middleware o rutas:

app.post("/upload", upload.single("archivo"),
  (req, res) => {...},
  (err, req, res, next) => {res.status(400).send(err.message);
});

9. ¿Cómo subir múltiples campos con archivos diferentes?

Usando upload.fields():

upload.fields([
  { name: "avatar", maxCount: 1 },
  { name: "docs", maxCount: 3 },
]);

🔴 Avanzado

10. ¿Se puede renombrar archivos automáticamente en Multer? ¿Cómo?

Sí, dentro de diskStorage usando la función filename:

filename: (req, file, cb) => cb(null, Date.now() + "-" + file.originalname);

11. ¿Cómo integrar Multer con servicios en la nube?

Subiendo archivos a memoria (memoryStorage) y luego enviándolos a servicios como AWS S3, Cloudinary o Firebase Storage usando sus SDKs.

12. ¿Qué problemas puede causar almacenar archivos grandes en disco local?

Puede llenar rápidamente el almacenamiento del servidor, generar cuellos de botella en rendimiento y no ser escalable en entornos de producción.

13. ¿Cómo combinar Multer con validación de datos de formularios?

Usando librerías como Joi o Zod para validar los campos de texto, mientras Multer maneja los archivos.

14. ¿Qué consideraciones de seguridad se deben tener al usar Multer?

Validar tipo de archivo y tamaño, no ejecutar archivos subidos, proteger rutas con autenticación, y evitar sobrescribir archivos existentes.

15. ¿Qué limitaciones tiene Multer frente a otros manejadores de archivos como Formidable o Busboy?

Multer es más simple y directo para Express, pero puede ser menos eficiente con cargas masivas de archivos grandes y no ofrece control avanzado de streaming de datos.

🔼 temas