• #nodejs
  • #express
  • #cloudinary

Subir archivos a cloudinary con Express y Nodejs

Introducción

Las aplicaciones web a menudo requieren la funcionalidad de permitir a los usuarios cargar archivos, como imágenes de perfil, documentos necesarios para la aplicación o videos de presentación, etc.

En este tutorial, aprenderás cómo implementar esta característica utilizando ExpressJS y NodeJS, además de integrarla con Cloudinary.

Cloudinary es una plataforma en la nube que permite a los usuarios subir, almacenar, gestionar y distribuir sus archivos de imagen, audio y video de manera fácil y segura. Con la integración de Cloudinary en una aplicación Express, puedes brindar a tus usuarios la capacidad de subir archivos directamente a tu aplicación web y manipularlos en tiempo real.

Configuración inicial de la aplicación

Primero vamos a configurar nuestra aplicación con ExpressJS.

Dirígete a la ubicación donde deseas crear tu aplicación:

Terminal
cd /home/jhon/Desktop/
mkdir express-cloudinary
cd express-cloudinary

Inicializamos npm, incluimos la opción -y, para aceptar la configuración por defecto Terminal ejecutando el comando npm i -y

Ahora instalamos las dependencias necesarias para nuestra aplicación

Terminal
npm install express express-fileupload cloudinary

En el archivo package.json, en la sección de scripts, incluimos el siguiente comando, esto nos servirá para iniciar nuestra aplicación.

package.json
"scripts": {
"start": "node app"
},

A continuación creamos el archivo app.js, donde usaremos express para crear nuestra aplicación.

Listado de archivos incluido app.js

En el archivo app.js escribimos lo siguiente:

app.js
const express = require('express');
const fileupload = require('express-fileupload');
const cloudinary = require('cloudinary').v2;
cloudinary.config('xxxxxx');
const app = express();
app.use(
fileupload({
useTempFiles: true,
tempFileDir: '/tmp/',
createParentPath: true,
})
);
// Imprime un formulario con un input file
// para adjuntar un archivo
app.get('/', (req, res) => {
res.writeHead(200, { 'content-type': 'text/html' });
res.end(`<h1>Upload Your File Here :)</h1>
<form
action="/"
method="post"
enctype="multipart/form-data"
>
<fieldset>
<legend>Upload your file</legend>
<label for="photo">File:</label>
<input type="file" name="photo" id="photo" />
</fieldset>
<button type="submit">Upload</button>
</form>`);
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});

Ahora en la consola al ejecutar el comando npm start, se iniciará nuestra aplicación y veremos lo siguiente:

Terminal ejecutando el comando npm start

En el navegador al visitar http://localhost:3000, podremos ver un formulario con un campo para adjuntar archivos

Formulario para adjuntar archivos

Configuración de cloudinary

A continuación vamos a crear una cuenta gratuita en Cloudinary.

Página de registro de cloudinary

Una vez creada la cuenta, nos dirigimos al dashboard en cloudinary, ahí podremos ubicar las credenciales necesarias para integrarlo a nuestro sistema.

Página de inicio de cloudinary

Integrar cloudinary en nuestra aplicación

Copiamos la sección API Environment variable de cloudinary, y lo adjuntamos en la parte de la configuración de cloudinary en nuestra aplicación.

cloudinary.config('cloudinary://**************:**************@dcyar');

Por último agregamos el código necesario para procesar el formulario.

app.post('/', async (req, res) => {
// Validamos que nos envíen algún archivo
if (!req.files || Object.keys(req.files).length === 0) {
return res.status(400).send('No files were uploaded.');
}
// Extraemos el archivo de la request
// el nombre "file" debe coincidir
// con el valor del atributo name del input
const file = req.files.file;
// Extraemos la extensión del archivo
const extension = file.mimetype.split('/')[1];
// Aquí validamos alguna extensión en particular
// cualquier otra, devolverá un error
const validExtensions = ['png', 'pdf'];
if (!validExtensions.includes(extension)) {
return res.status(400).send('Not valid file extension');
}
// Hacemos uso de cloudinary para subir el archivo
const uploaded = await cloudinary.uploader.upload(file.tempFilePath, {
folder: 'images', // Asignamos la carpeta de destino
});
// Extraemos la url pública del archivo en cloudinary
const { secure_url } = uploaded;
// Devolvemos una respuesta con la url del archivo
res.send(
`<p>File uploaded to cloudinary!</p>
<a href="${secure_url}">File here</a>`
);
});

Ahora, si volvemos a la url de nuestra aplicación, adjuntamos un archivo y pulsamos en el botón Upload, podremos ver la siguiente pantalla.

Página de respuesta de formulario para subir archivos a cloudinary

Al pulsar en el enlace File here, se abrirá una pestaña con la imagen de subimos.

Si visitamos la pestaña de Media Library en cloudinary podremos ver la carpeta images y dentro de ella el archivo que adjuntamos en el formulario.

Página de media library de cloudinary

Eso es todo, ahora ya podemos agregar la funcionalidad de subir archivos a nuestros proyectos.

Nota: en este ejemplo pusimos la url de cloudinary, dentro del archivo app.js, generalmente y por seguridad deberíamos agregar dicha url en un archivo de variables (.env), podemos lograrlo con el paquete dotenv.

También te dejo un repositorio con el código que vimos, también incluye la opción para subir archivos a una carpeta del mismo proyecto.

Proyecto para subir archivos a una carpeta del mismo proyecto y a cloudinary

Te puede interesar: Laravel 9.42.0 Singleton Route Resource