Ciao, ho fatto una prova come promesso.
In larga parte è merito del mozilla developer network, che fornisce
una serie di infomazioni ed esempi molto interessanti per passare tramite Ajax del contenuto in formato binario.
A quel punto è stato facile applicare il concetto dell'attributo download dell'anchor come ti ho scritto.
Il risultato (che funziona con buona parte dei browser più recenti) è il seguente:
HTML:
<!DOCTYPE HTML>
<html>
<head><title>Ajax Binary Download</title></head>
<body>
<a href="#" id="downloadme">Download File</a>
<script>
function download(resource) {
var a = document.getElementById('downloadme');
var oReq = new XMLHttpRequest();
oReq.open("GET", resource, true);
oReq.responseType = "arraybuffer";
resource = resource.split('/');
var fileName = resource[resource.length-1];
oReq.onload = function() {
var blob = new Blob([oReq.response], {type: "image/png"});
var url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
};
oReq.send();
}
download('/imgs/image.png');
</script>
</body>
</html>
Due considerazioni, anzi tre:
1. Devi implementare qualche controllo per riconoscere il mime type adeguato del file che ti prefiggi di scaricare, nel mio caso lo scopo dell'esempio era dimostrare la fattibilità del download quindi ho scritto manualmente "image/png".
2. Ovviamente lo script così com'è manca di tutta una serie di controlli preparatori. Ad esempio se scarichi un file voluminoso il download sul link potrebbe non essere pronto prima di un tot di tempo.
3. Restando in tema di file molto voluminosi questo metodo non effettua uno streaming delle informazioni, se vuoi passare files di centinaia di megabyte in questo modo devi dividere il download del file binario in più parti che poi devi ricomporre con javascript prima di infilarlo nell'anchor.
Spero l'esempio ti sia d'aiuto