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
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 ☕