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.
Para obtener más información y explorar todas las características de Multer, podéis visitar el repositorio oficial en GitHub.
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();
}
});