I came across this SO question trying to figure out how to download a PNG image and found that Shubham Verma's answer didn't quite do it for me as the downloaded file couldn't be opened. I needed to use arraybuffer to convert the image.
Here's the code that worked.
function App() {
const download = e => {
console.log(e.target.href);
fetch(e.target.href, {
method: "GET",
headers: {}
})
.then(response => {
response.arrayBuffer().then(function(buffer) {
const url = window.URL.createObjectURL(new Blob([buffer]));
const link = document.createElement("a");
link.href = url;
link.setAttribute("download", "image.png"); //or any other extension
document.body.appendChild(link);
link.click();
});
})
.catch(err => {
console.log(err);
});
};
return (
<div className="App">
<a
href="https://upload.wikimedia.org/wikipedia/en/6/6b/Hello_Web_Series_%28Wordmark%29_Logo.png"
download
onClick={e => download(e)}
>
<i className="fa fa-download" />
download
</a>
</div>
);
}
Codesandbox: https://codesandbox.io/s/dreamy-gould-h1l72
P.S.: The download approach was taken from the following answer, but I used plain fetch instead of Axios.
Download binary file with Axios
download
attribute only works for same-origin URLs - you can't use it to download a file from another site. – Tullis