Malheureusement, la réponse de @ BrianFreud ne correspond pas à mes besoins, j'avais un besoin un peu différent, et je sais que ce n'est pas la réponse à la question de @ BrianFreud, mais je la laisse ici parce que beaucoup de personnes sont arrivées ici avec mon même besoin. J'avais besoin de quelque chose comme «Comment obtenir un fichier ou un objet blob à partir d'une URL?», Et la bonne réponse actuelle ne correspond pas à mes besoins car elle n'est pas interdomaine.
J'ai un site Web qui consomme des images d'un stockage Amazon S3 / Azure, et j'y stocke des objets nommés avec des identificateurs uniques:
exemple: http: //****.blob.core.windows.net/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf
Certaines de ces images doivent être téléchargées depuis notre interface système. Pour éviter de faire passer ce trafic via mon serveur HTTP, puisque cet objet ne nécessite aucune sécurité pour accéder (sauf par filtrage de domaine), j'ai décidé de faire une requête directe sur le navigateur de l'utilisateur et d'utiliser un traitement local pour donner au fichier un vrai nom et extension.
Pour ce faire, j'ai utilisé cet excellent article de Henry Algus:
http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
1. Première étape: ajouter le support binaire à 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. Deuxième étape: faites une demande en utilisant ce type de transport.
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);
});
}
Vous pouvez maintenant utiliser le Blob créé comme vous le souhaitez, dans mon cas, je veux l'enregistrer sur le disque.
3. Facultatif: enregistrez le fichier sur l'ordinateur de l'utilisateur à l'aide de FileSaver
J'ai utilisé FileSaver.js pour enregistrer sur le disque le fichier téléchargé, si vous devez accomplir cela, veuillez utiliser cette bibliothèque javascript:
https://github.com/eligrey/FileSaver.js/
J'espère que cela aidera d'autres personnes ayant des besoins plus spécifiques.
XMLHttpRequest
à l'URL du blob.