Node.js — How to Download a File

You can download a file in Node.js in different ways. Node.js comes with built-in functions to download and save a file to your local disk. You can combine the integrated https and fs modules to download files from the Internet.

This tutorial shows you how to use native Node.js features to download a file from the Internet to your local computer.

Node.js Series Overview

  1. How to Download a File

Download a File in Node.js

Node.js’ https module allows you to send requests HTTPS requests. The given https.get method accepts the resource URL and an options object. In this example, we’re using the file URL on the Internet and skip the request options because we don’t need them.

The https.get method provides the response instance in a callback function. The response gives you access to the response status code, headers, and payload. Determine whether the request is successful and pipe the response data into a local file.

You can create a write stream piping the response data into a local target file. Here’s a sample function to download a file in Node.js:

import Fs from 'fs'  
import Https from 'https'

/**
 * Download a file from the given `url` into the `targetFile`.
 *
 * @param {String} url
 * @param {String} targetFile
 *
 * @returns {Promise<void>}
 */
async function downloadFile (url, targetFile) {  
  return await new Promise((resolve, reject) => {
    Https.get(url, response => {
      const code = response.statusCode ?? 0

      if (code >= 400) {
        return reject(new Error(response.statusMessage))
      }

      // handle redirects
      if (code > 300 && code < 400 && !!response.headers.location) {
        return downloadFile(response.headers.location, targetFile)
      }

      // save the file to disk
      const fileWriter = Fs
        .createWriteStream(targetFile)
        .on('finish', () => {
          resolve({})
        })

      response.pipe(fileWriter)
    }).on('error', error => {
      reject(error)
    })
  })
}

Notice: the downloadFile function above wraps the https.get method into a promise. You may not need the promise. Modern Node.js code typically uses async/await instead of callbacks. That’s the reason you may want to use promises as well.

Then use the downloadFile method to download content from the Internet. For example, you may want to download a new wallpaper like this:

const targetFile = 'wallpaper.png'  
const wallpaperUrl = 'https://unsplash.com/photos/W-fi1aeE-N8'

await download(wallpaperUrl, targetFile)  

That’s it! Enjoy downloading files in Node.js!


Mentioned Resources

Explore the Library

Find interesting tutorials and solutions for your problems.