Force Download an Image Using Javascript
You need to use server-side scripting for this. Search on stackoverflow.
Alternately, your server might allow you to alter headers dynamically via configuration.
Apache solution with mod_headers
Place your downloadable images in a directory. Inside this directory, create a .htaccess
file with the following contents:
SetEnvIf Request_URI "([^/]+\.jpg)$" REQUESTED_IMAGE_BASENAME=$1
SetEnvIf Request_URI "([^/]+\.png)$" REQUESTED_IMAGE_BASENAME=$1
Header set Content-Disposition "attachment; filename=\"%{REQUESTED_IMAGE_BASENAME}e\"" env=REQUESTED_IMAGE_BASENAME
Test Request:
HEAD /test/Water%20lilies.jpg HTTP/1.1
Host: localhost
Test Response:
HTTP/1.1 200 OK
Date: Sat, 23 Jul 2011 09:03:52 GMT
Server: Apache/2.2.17 (Win32)
Last-Modified: Thu, 23 Aug 2001 14:00:00 GMT
ETag: "26000000017df3-14752-38c32e813d800"
Accept-Ranges: bytes
Content-Length: 83794
Content-Disposition: attachment; filename="Water lilies.jpg"
Content-Type: image/jpeg
HTML5 Solution
You can use the HTML5 download
attribute on anchors:
<p>Example 1<br> <a href="http://dummyimage.com/600x400/000/fff.png" download>Download this image</a></p>
<p>Example 2<br> <a href="http://dummyimage.com/600x400/000/fff.png" download="alternate-filename.png"><img src="http://dummyimage.com/150x100/000/fff.png"></a></p>
Browser/HTML Force download of image from src=data:image/jpeg;base64...
Simply replace image/jpeg
with application/octet-stream
. The client would not recognise the URL as an inline-able resource, and prompt a download dialog.
A simple JavaScript solution would be:
//var img = reference to image
var url = img.src.replace(/^data:image\/[^;]+/, 'data:application/octet-stream');
window.open(url);
// Or perhaps: location.href = url;
// Or even setting the location of an <iframe> element,
Another method is to use a blob:
URI:
var img = document.images[0];
img.onclick = function() {
// atob to base64_decode the data-URI
var image_data = atob(img.src.split(',')[1]);
// Use typed arrays to convert the binary data to a Blob
var arraybuffer = new ArrayBuffer(image_data.length);
var view = new Uint8Array(arraybuffer);
for (var i=0; i<image_data.length; i++) {
view[i] = image_data.charCodeAt(i) & 0xff;
}
try {
// This is the recommended method:
var blob = new Blob([arraybuffer], {type: 'application/octet-stream'});
} catch (e) {
// The BlobBuilder API has been deprecated in favour of Blob, but older
// browsers don't know about the Blob constructor
// IE10 also supports BlobBuilder, but since the `Blob` constructor
// also works, there's no need to add `MSBlobBuilder`.
var bb = new (window.WebKitBlobBuilder || window.MozBlobBuilder);
bb.append(arraybuffer);
var blob = bb.getBlob('application/octet-stream'); // <-- Here's the Blob
}
// Use the URL object to create a temporary URL
var url = (window.webkitURL || window.URL).createObjectURL(blob);
location.href = url; // <-- Download!
};
Relevant documentation
atob
- Typed arrays
URL.createObjectURL
Blob
andBlobBuilder
Download File Using JavaScript/jQuery
Use an invisible <iframe>
:
<iframe id="my_iframe" style="display:none;"></iframe>
<script>
function Download(url) {
document.getElementById('my_iframe').src = url;
};
</script>
To force the browser to download a file it would otherwise be capable of rendering (such as HTML or text files), you need the server to set the file's MIME Type to a nonsensical value, such as application/x-please-download-me
or alternatively application/octet-stream
, which is used for arbitrary binary data.
If you only want to open it in a new tab, the only way to do this is for the user to a click on a link with its target
attribute set to _blank
.
In jQuery:
$('a#someID').attr({target: '_blank',
href : 'http://localhost/directory/file.pdf'});
Whenever that link is clicked, it will download the file in a new tab/window.
Force Download Images with Javascript
For a download link you can use a link with the "download" attribute (from here):
<a href="https://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,-73.988354&fov=120&heading=120&pitch=20&key=AIzaSyC6UbcmFhZkX2q-3EyuHxl56e4zaF3L0y4" download>Download</a>
For an automatic download you can use a script (from here):
<script type="text/javascript">
var link = document.createElement('a');
link.href = 'https://maps.googleapis.com/maps/api/streetview?size=400x400&location=40.720032,-73.988354&fov=120&heading=120&pitch=20&key=AIzaSyC6UbcmFhZkX2q-3EyuHxl56e4zaF3L0y4';
link.download = 'Download.jpg';
document.body.appendChild(link);
link.click();
</script>
Related Topics
Why Doesn't Decodeuri("A+B") == "A B"
Accessing ASP.NET Controls Using Jquery (All Options)
Encrypting Data with Ruby Decrypting with Node
How to Get Objects Value If Its Name Contains Dots
Xmlhttprequest Status 0 (Responsetext Is Empty)
JavaScript Es6 Array Feature [...Data, 0] "Spread Operator"
Double Negation (!!) in JavaScript - What Is the Purpose
How to Control the Back Button Event in Jquery Mobile
Allow Only Numbers to Be Typed in a Textbox
Sort JavaScript Array by Two Numeric Fields
How to Pause Setinterval() Functions
How to Disable Browser Developer Tools
How to Get the Browser Language Using JavaScript
"Cannot Use Import Statement Outside a Module" Error When Importing React-Hook-Mousetrap in Next.Js