How to Download an Image from a URL in Node.js

In the world of Node.js, it's common to find yourself needing to download an image from a URL for various purposes. Be it for creating a cache, preprocessing images, or simply saving them for later use, understanding how to do this is a valuable skill for any developer working in the Node.js environment. In this article, we'll explore how to download an image from a URL in Node.js using the async/await syntax. We'll look at how to download the image both to a file and to a buffer, which will allow for easier usage in another task.

Downloading an Image to a File

First, we'll see how to download an image to a file. To do this, we just need to make a request to the image URL and then writing the response to a file. The http or https module can be used to make the request, depending on the URL protocol, and the fs (File System) module can be used to write the response to a file.

However, to simplify things, we'll be using the axios package for making HTTP requests since it automatically chooses the correct protocol and makes our code much easier to read.

To start, install axios by running:

$ npm install axios

Next, let's take a look at a simple function that downloads an image from a URL and writes it to a file:

const fs = require('fs');
const axios = require('axios');

async function downloadImage (url, imagePath) {
    const response = await axios({
        url,
        method: 'GET',
        responseType: 'stream'
    });

    const writer = fs.createWriteStream(imagePath);

    response.data.pipe(writer);

    return new Promise((resolve, reject) => {
        writer.on('finish', resolve);
        writer.on('error', reject);
    });
}
Get free courses, guided projects, and more

No spam ever. Unsubscribe anytime. Read our Privacy Policy.

In the above code, we're using axios to send a GET request to the URL and specifying a responseType of 'stream'. This tells axios to return the response as a stream, which we can then pipe to the file system's write stream (fs.createWriteStream).

We also return a promise that resolves when the file write is finished and rejects if an error occurs during the process. This way we can more easily use the async/await syntax when calling this function.

Note: Don't forget to wrap this code in a try-catch block to properly handle any potential errors during the request or the file writing process.

Downloading an Image to a Buffer

The process to download an image to a buffer is similar to downloading it to a file, but instead of piping the response data to a file, we'll accumulate it in a buffer. A buffer can be particularly useful when you want to perform some further operations on the image right after downloading it.

Take a look at the following function:

const axios = require('axios');

async function downloadImageToBuffer(url) {
    const response = await axios({
        url,
        method: 'GET',
        responseType: 'arraybuffer'
    });

    const buffer = Buffer.from(response.data, 'binary');

    return buffer;
}

Here, we set the responseType to 'arraybuffer' and then create a buffer from the response data. This buffer can now be used for various tasks, such as uploading the image to a different server or processing it further.

Buffers in Node.js are a powerful tool for handling binary data. They can store and manipulate chunks of data in a way that's efficient and easy to use.

Conclusion

Downloading an image from a URL in Node.js can be accomplished with relative ease using the axios package and built-in Node.js modules. Whether you're saving the image to a file for later use or directly downloading it to a buffer for immediate processing, understanding how to perform these tasks is an important part of working with Node.js. Remember to always handle errors appropriately!

Last Updated: July 22nd, 2023
Was this helpful?

© 2013-2024 Stack Abuse. All rights reserved.

AboutDisclosurePrivacyTerms