Descargar múltiples imagenes con Axios en Node

Descargar múltiples imagenes con Axios en Node

Suponiendo que se necesita descargar la imagen correspondiente a cada url en un arreglo de imagenes. Para lograrlo, haremos uso de las librerías que se mencionan a continuación. Además, resolveremos un problema de cola con fin de que nuestras descargas se realizen una a la vez sin errores.

Requisitos necesarios

axios

throttled-queue

En caso de no tener creada nuestra aplicación, procedemos a ejecutar:

npm init --y
npm i axios throttled-queue

Nota: Recordar que, tanto fs como path, vienen por defecto en Node.

Comenzamos a codear

Ahora, podemos proceder a solventar el problema. Crearemos un archivo llamado download.images.js en la carpeta que se considere adecuada. A efectos prácticos, al no tener una estructura definida, en mi caso, se creará en la raíz de mi aplicación.

const throttledQueue = require('throttled-queue');
const axios = require('axios');
const path = require('path');
const fs = require('fs');

async function downloadImages(fileUrl, downloadPath) {
    throttle(async () => {
        const fileName = path.basename(fileUrl);
        const localFilePath = path.resolve(__dirname, downloadPath, fileName);

        try {
            const response = await axios({
                method: 'GET',
                url: fileUrl,
                responseType: 'stream',
            });

            const writer = response.data.pipe(fs.createWriteStream(localFilePath));

            writer.on('finish', () => {
                console.log('Successfully downloaded file/s!');
            });

        } catch (error) {
            console.log(error);
            throw new Error(error);
        }
    })
};

module.exports = downloadImages;

Una vez tenemos definida nuestra función de descarga de imágenes, procedemos a su caso de uso. Para eso, necesitaremos nuestro arreglo de urls sobre el cual iterar mientras descargamos las imágenes una a una.

Crearemos un archivo index.js donde agregaremos un arreglo de urls de ejemplo:

const downloadImages = require('./download.images');

const urls = [
    'https://i.pinimg.com/originals/10/ee/1a/10ee1a02b96ed40101d1a2ed7d9bb9da.png',
    'https://masdeloqueimaginas.elmundo.es/assets/img/05/poster.jpg',
    'https://estaticos-cdn.elperiodico.com/clip/c4973cb3-c944-4ece-943d-0e118060cdaa_alta-libre-aspect-ratio_default_0.jpg',
]

urls.forEach(url => {
    downloadImages(url, 'download');
});

Como se ve en el código anterior, iteramos sobre nuestro arreglo de urls y además, le pasamos como segundo argumento a la función, un path correspondiente a la carpeta de descargas.

Nota: Crear dicha carpeta o definir la carpeta que se ajuste a tu necesidad.

Testing

Por último, para probar nuestra implementación, ejecutaremos nuestra aplicación.

node index

En la consola, veremos el siguiente mensaje (por cada imagen descargada). Successfully downloaded file/s!

¡Hasta pronto 👋!

Si deseas colaborar con el contenido, regalame un cafecito