Leider passt die Antwort von @ BrianFreud nicht zu meinen Bedürfnissen, ich hatte ein etwas anderes Bedürfnis und ich weiß, dass dies nicht die Antwort auf die Frage von @ BrianFreud ist, aber ich lasse sie hier, weil viele Personen mit demselben Bedürfnis hierher gekommen sind. Ich brauchte etwas wie "Wie bekomme ich eine Datei oder einen Blob von einer URL?", Und die aktuell richtige Antwort entspricht nicht meinen Anforderungen, da sie nicht domänenübergreifend ist.
Ich habe eine Website, die Bilder aus einem Amazon S3 / Azure-Speicher verwendet, und dort speichere ich Objekte mit eindeutigen Kennungen:
Beispiel: http: //****.blob.core.windows.net/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf
Einige dieser Bilder sollten von unserer Systemschnittstelle heruntergeladen werden. Um zu vermeiden, dass dieser Datenverkehr über meinen HTTP-Server geleitet wird, habe ich beschlossen, eine direkte Anfrage im Browser des Benutzers zu stellen und der Datei die lokale Verarbeitung zu geben, um der Datei einen echten Namen zu geben, da für diese Objekte keine Sicherheit erforderlich ist (außer durch Domänenfilterung) Erweiterung.
Um dies zu erreichen, habe ich diesen großartigen Artikel von Henry Algus verwendet:
http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
1. Erster Schritt: Fügen Sie jquery binäre Unterstützung hinzu
/**
*
* 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. Zweiter Schritt: Stellen Sie eine Anfrage mit diesem Transporttyp.
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);
});
}
Jetzt können Sie den erstellten Blob so verwenden, wie Sie möchten. In meinem Fall möchte ich ihn auf der Festplatte speichern.
3. Optional: Speichern Sie die Datei mit FileSaver auf dem Computer des Benutzers
Ich habe FileSaver.js verwendet, um die heruntergeladene Datei auf der Festplatte zu speichern. Wenn Sie dies benötigen, verwenden Sie bitte diese Javascript-Bibliothek:
https://github.com/eligrey/FileSaver.js/
Ich erwarte, dass dies anderen mit spezifischeren Bedürfnissen hilft.
XMLHttpRequest
an die Blob-URL zu senden .