Sfortunatamente la risposta di @ BrianFreud non si adatta alle mie esigenze, avevo un'esigenza leggermente diversa, e so che non è la risposta alla domanda di @ BrianFreud, ma la lascio qui perché molte persone sono arrivate qui con la mia stessa esigenza. Avevo bisogno di qualcosa come "Come ottenere un file o un BLOB da un URL?" E la risposta corretta corrente non si adatta alle mie esigenze perché non è interdominio.
Ho un sito Web che utilizza immagini da Amazon S3 / Azure Storage e lì memorizzo oggetti denominati con identificatori univoci:
esempio: http: //****.blob.core.windows.net/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf
Alcune di queste immagini dovrebbero essere scaricate dalla nostra interfaccia di sistema. Per evitare di far passare questo traffico attraverso il mio server HTTP, dal momento che questi oggetti non richiedono alcuna sicurezza per essere accessibili (eccetto per il filtraggio del dominio), ho deciso di fare una richiesta diretta sul browser dell'utente e utilizzare l'elaborazione locale per dare al file un nome reale e estensione.
Per riuscirci ho usato questo fantastico articolo di Henry Algus:
http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
1. Primo passo: aggiungi il supporto binario a jquery
/**
*
* jquery.binarytransport.js
*
* @description. jQuery ajax transport for making binary data type requests.
* @version 1.0
* @author Henry Algus <henryalgus@gmail.com>
*
*/
// use this transport for "binary" data type
$.ajaxTransport("+binary", function (options, originalOptions, jqXHR) {
// check for conditions and support for blob / arraybuffer response type
if (window.FormData && ((options.dataType && (options.dataType == 'binary')) || (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || (window.Blob && options.data instanceof Blob))))) {
return {
// create new XMLHttpRequest
send: function (headers, callback) {
// setup all variables
var xhr = new XMLHttpRequest(),
url = options.url,
type = options.type,
async = options.async || true,
// blob or arraybuffer. Default is blob
dataType = options.responseType || "blob",
data = options.data || null,
username = options.username || null,
password = options.password || null;
xhr.addEventListener('load', function () {
var data = {};
data[options.dataType] = xhr.response;
// make callback and send data
callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders());
});
xhr.open(type, url, async, username, password);
// setup custom headers
for (var i in headers) {
xhr.setRequestHeader(i, headers[i]);
}
xhr.responseType = dataType;
xhr.send(data);
},
abort: function () {
jqXHR.abort();
}
};
}
});
2. Secondo passaggio: effettuare una richiesta utilizzando questo tipo di trasporto.
function downloadArt(url)
{
$.ajax(url, {
dataType: "binary",
processData: false
}).done(function (data) {
// just my logic to name/create files
var filename = url.substr(url.lastIndexOf('/') + 1) + '.png';
var blob = new Blob([data], { type: 'image/png' });
saveAs(blob, filename);
});
}
Ora puoi usare il Blob creato come vuoi, nel mio caso voglio salvarlo su disco.
3. Opzionale: salvare il file sul computer dell'utente utilizzando FileSaver
Ho usato FileSaver.js per salvare su disco il file scaricato, se è necessario farlo, usa questa libreria javascript:
https://github.com/eligrey/FileSaver.js/
Mi aspetto che questo aiuti gli altri con esigenze più specifiche.
XMLHttpRequest
all'URL del blob.