DEV Community

Cover image for Download Images using JavaScript 📸
Sapan Bodiwala
Sapan Bodiwala

Posted on

69 7

Download Images using JavaScript 📸

Let's say you're trying to add a feature to your site or app to allow users to download an image upon clicking a button. Should be pretty straight forward right? I thought so myself as I needed to add this feature when building an internal media library tool at Discovery.

I tried adding this feature by just adding the download attribute to an anchor tag and setting the href attribute to the image url (cross-origin url).

<a href='URL_HERE' download>Download image</a>
Enter fullscreen mode Exit fullscreen mode

Turns out that Chrome started ignoring download attributes that pointed to cross origin urls.

To solve this, we'll take advantage of the browser built in fetch method. You'll need to add an event listener to the element that you want to trigger the image download and call the below function:

// Using fetch
async function downloadImage(imageSrc) {
  const image = await fetch(imageSrc)
  const imageBlog = await image.blob()
  const imageURL = URL.createObjectURL(imageBlog)

  const link = document.createElement('a')
  link.href = imageURL
  link.download = 'image file name here'
  document.body.appendChild(link)
  link.click()
  document.body.removeChild(link)
}
Enter fullscreen mode Exit fullscreen mode

The imageSrc function parameter represents the cross origin image url.

  1. First, we use fetch to get the ReadableStream data of the image
  2. Next, we call the blob method provided by fetch to get the raw image data
  3. Third, we use the URL Web API to call the createObjectURL static method to create a URL that represents the image's download URL
  4. Finally, an anchor element is created to set the new url to the href attribute. You can also set the name of the file by setting the download attribute of the anchor element. Last, we append the anchor element we created to the DOM and trigger a click to download the image and then quickly remove the anchor from the document.

And there you go! You now have the ability to download images on the trigger of a function!

I hope this helped and was useful for you!

This post can also be found at sapanbodiwala.com/blog

Image of AssemblyAI

Automatic Speech Recognition with AssemblyAI

Experience near-human accuracy, low-latency performance, and advanced Speech AI capabilities with AssemblyAI's Speech-to-Text API. Sign up today and get $50 in API credit. No credit card required.

Try the API

Top comments (15)

Collapse
 
vishwakarmad1999 profile image
Divya Vishwakarma

Mota bhai this doesn't work when there's CORS restriction!!!
It will fail at the first fetch call itself.

Collapse
 
semleel profile image
Yi Sem

it works!! thanks alot

Collapse
 
akashkaintura profile image
AKASH KAINTURA

Not Helpful

Collapse
 
san profile image
Ihsan

Thanks dude!

Collapse
 
amirjafari1992 profile image
Amir Jafari

You made my day man! Thank you for sharing

Collapse
 
daddasoft profile image
Dadda Hicham

best one thanks 👍

Collapse
 
uzair004 profile image
Muhammad Uzair

What if image can't be fetched from its source ? it there any other way to get image from DOM ?

Collapse
 
woochul profile image
Woochul Lee

It works well. Thanks.

Collapse
 
faisalamin001 profile image
Faisal Amin

Awesome, it worked! 👏

Collapse
 
javicodev11 profile image
Javico11

Maybe someone solved the CORS problem?

Cloudinary image

Video API: manage, encode, and optimize for any device, channel or network condition. Deliver branded video experiences in minutes and get deep engagement insights.

Learn more

👋 Kindness is contagious

Immerse yourself in a wealth of knowledge with this piece, supported by the inclusive DEV Community—every developer, no matter where they are in their journey, is invited to contribute to our collective wisdom.

A simple “thank you” goes a long way—express your gratitude below in the comments!

Gathering insights enriches our journey on DEV and fortifies our community ties. Did you find this article valuable? Taking a moment to thank the author can have a significant impact.

Okay