user2316602
user2316602

Reputation: 632

Node.js download multiple files

I need to download multiple files from urls. I have got list of them in the file. How should I do that? I already made it, but it's not working. I need to wain until last download is done before starting next wan. How can I do that?

Upvotes: 1

Views: 7642

Answers (3)

ozgrozer
ozgrozer

Reputation: 2042

I think this is what you're looking for.

const fs = require('fs')
const https = require('https')

const downloadFolderPath = 'downloads'
const urls = [
  'url 1',
  'url 2'
]

const downloadFile = url => {
  return new Promise((resolve, reject) => {
    const splitUrl = url.split('/')
    const filename = splitUrl[splitUrl.length - 1]
    const outputPath = `${downloadFolderPath}/${filename}`
    const file = fs.createWriteStream(outputPath)

    https.get(url, res => {
      if (res.statusCode === 200) {
        res.pipe(file).on('close', resolve)
      } else {
        reject(res.statusCode)
      }
    })
  })
}

if (!fs.existsSync(downloadFolderPath)) {
  fs.mkdirSync(downloadFolderPath)
}

let downloadedFiles = 0
urls.forEach(async url => {
  await downloadFile(url)
  downloadedFiles++
  console.log(`${downloadedFiles}/${urls.length} downloaded`)
})

Upvotes: 1

RaviTeja
RaviTeja

Reputation: 43

You can read files using fs (var fs = require('fs');)in node js

fs.readFile('<filepath>', "utf8", function (err, data) {
        if (err) throw err;
        console.log(data);
                });

Upvotes: 0

thriqon
thriqon

Reputation: 2488

You want to call the download function from the callback of the file before that. I threw together something, do not consider it pretty nor production ready, please ;-)

var http = require('http-get');

var files = { 'url' : 'local-location', 'repeat-this' : 'as often as you want' };

var MultiLoader = function (files, finalcb) {

        var load_next_file = function (files) {

                if (Object.keys(files) == 0) {
                        finalcb(null);
                        return;
                }   

                var nexturl = Object.keys(files)[0];
                var nextfnname = files[nexturl];

                console.log('will load ' + nexturl);
                http.get(nexturl, nextfnname, function (err, result) {
                        console.log('loaded ' + nexturl);
                        delete files[nexturl];
                        load_next_file(files);
                }); 
        };  

        load_next_file(JSON.parse(JSON.stringify(files)));

};

MultiLoader(files, function () { console.log('finalcb'); }); 

http-get is not a standard node module, you can install it via npm install http-get.

Upvotes: 4

Related Questions