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
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…