subir-multiples-ficheros-multer

Qué es Multer y cómo usarlo para subir archivos en Express

Multer es un middleware de Node.js diseñado para manejar la carga de archivos en aplicaciones web, normalmente en combinación con Express.

Su principal función es facilitar la subida de archivos a través de formularios web, lo que resulta esencial para cualquier aplicación que necesite manejar archivos, como imágenes, documentos o videos.

Con Multer, podemos gestionar fácilmente la carga de archivos y realizar operaciones sobre ellos, como el almacenamiento en disco o en la memoria.

Proporciona varias características útiles para trabajar con archivos:

  • Almacenamiento: Permite especificar si los archivos deben almacenarse en disco o en memoria.
  • Filtrado de archivos: Permite validar y filtrar archivos basados en su tipo, tamaño y otras propiedades.
  • Rutas personalizadas: Facilita la configuración de rutas para almacenar archivos y manejarlos según nuestras necesidades.

Cómo instalar Multer

Para comenzar a usar Multer, primero necesitamos instalarlo en nuestro proyecto Node.js. Asumimos que ya tenemos un proyecto Express configurado. Si aún no lo tenemos, podemos iniciar uno con:

npm init -y
npm install express

Luego, instalamos Multer a través de npm:

npm install multer

Cómo usar Multer

Para utilizar Multer, necesitamos configurarlo y agregarlo como middleware en nuestras rutas Express. Vamos a ver cómo hacerlo con un ejemplo simple que maneja la carga de un archivo.

Crear una instancia de Multer

Primero, importamos Multer y configuramos el almacenamiento. En este ejemplo, almacenamos los archivos en el disco:

const multer = require('multer');
const path = require('path');

// Configuración del almacenamiento
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    // Definir el directorio de destino
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    // Definir el nombre del archivo
    cb(null, Date.now() + path.extname(file.originalname));
  }
});

// Crear una instancia de Multer con la configuración de almacenamiento
const upload = multer({ storage: storage });

Configurar una ruta para

Ahora, configuramos una ruta en nuestro servidor Express que manejará la carga de archivos. Usamos el middleware upload.single para procesar un único archivo en el campo file.

const express = require('express');
const app = express();

// Ruta para cargar un solo archivo
app.post('/upload', upload.single('file'), (req, res) => {
  // El archivo cargado estará disponible en req.file
  console.log(req.file);
  res.send('Archivo cargado exitosamente.');
});

// Iniciar el servidor
app.listen(3000, () => {
  console.log('Servidor corriendo en http://localhost:3000');
});

En este caso, upload.single('file') indica que el campo del formulario que contiene el archivo se llama file. La información del archivo cargado estará disponible en req.file.

Manejo de múltiples archivos

Si necesitamos cargar múltiples archivos a la vez, podemos usar upload.array o upload.fields. A continuación, mostramos cómo usar upload.array para cargar varios archivos en un solo campo:

app.post('/uploads', upload.array('files', 10), (req, res) => {
  // Los archivos cargados estarán disponibles en req.files
  console.log(req.files);
  res.send('Archivos cargados exitosamente.');
});

En este ejemplo, upload.array('files', 10) indica que el campo del formulario se llama files y permite cargar hasta 10 archivos.

Filtrado de archivos

Multer también permite filtrar archivos basados en su tipo o tamaño. Podemos usar la opción fileFilter para especificar las condiciones de filtrado:

const upload = multer({
  storage: storage,
  fileFilter: (req, file, cb) => {
    // Aceptar solo archivos de tipo imagen
    if (file.mimetype.startsWith('image/')) {
      cb(null, true);
    } else {
      cb(new Error('Solo se permiten archivos de imagen.'), false);
    }
  }
});

Manejo de errores

Es importante manejar los errores que puedan surgir durante la carga de archivos. Podemos hacerlo agregando un middleware de manejo de errores en nuestra aplicación Express:

app.use((err, req, res, next) => {
  if (err) {
    res.status(400).send(`Error: ${err.message}`);
  } else {
    next();
  }
});