Niestety odpowiedź @ BrianFreud nie pasuje do moich potrzeb, miałem trochę inną potrzebę i wiem, że to nie jest odpowiedź na pytanie @ BrianFreud, ale zostawiam ją tutaj, ponieważ wiele osób przybyło tutaj z tą samą potrzebą. Potrzebowałem czegoś w stylu „Jak uzyskać plik lub obiekt blob z adresu URL?”, A aktualna poprawna odpowiedź nie odpowiada moim potrzebom, ponieważ nie jest międzydomenowa.
Mam witrynę internetową, która zużywa obrazy z magazynu Amazon S3 / Azure i tam przechowuję obiekty o nazwach z unikatowymi identyfikatorami:
przykład: http: //****.blob.core.windows.net/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf
Niektóre z tych obrazów należy pobrać z naszego interfejsu systemowego. Aby uniknąć przekazywania tego ruchu przez mój serwer HTTP, ponieważ te obiekty nie wymagają dostępu do żadnych zabezpieczeń (z wyjątkiem filtrowania domeny), postanowiłem wykonać bezpośrednie żądanie w przeglądarce użytkownika i użyć lokalnego przetwarzania, aby nadać plikowi prawdziwą nazwę i rozbudowa.
Aby to osiągnąć, wykorzystałem ten wspaniały artykuł Henry'ego Algusa:
http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
1. Pierwszy krok: dodaj obsługę binarną do 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. Krok drugi: Złóż wniosek przy użyciu tego typu transportu.
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);
});
}
Teraz możesz użyć utworzonego Bloba, jak chcesz, w moim przypadku chcę go zapisać na dysku.
3. Opcjonalnie: Zapisz plik na komputerze użytkownika za pomocą programu FileSaver
Użyłem FileSaver.js do zapisania na dysku pobranego pliku, jeśli chcesz to zrobić, użyj tej biblioteki javascript:
https://github.com/eligrey/FileSaver.js/
Oczekuję, że pomoże to innym z bardziej konkretnymi potrzebami.
XMLHttpRequest
adres URL obiektu blob.