Purtroppo @ risposta di BrianFreud non si adatta alle mie esigenze, ho avuto un po 'diversa esigenza e so che non è la risposta alla domanda di @ BrianFreud, ma la lascio qui perché molte persone sono arrivate qui con la mia stessa necessità. Avevo bisogno di qualcosa come "Come ottenere un file o un blob da un URL?", E la risposta corretta attuale non si adatta alle mie esigenze perché non è un dominio incrociato.
Ho un sito web che consuma le immagini da un Amazon S3/Azure, e lì ho memorizzare oggetti con nome con uniqueidentifiers:
esempio: http: //****.blob.core.windows. net/systemimages/bf142dc9-0185-4aee-a3f4-1e5e95a09bcf
Alcune di queste immagini devono essere scaricate dalla nostra interfaccia di sistema. Per evitare di passare questo traffico attraverso il mio server HTTP, poiché questo oggetto non richiede l'accesso a nessuna sicurezza (eccetto il filtro del dominio), ho deciso di fare una richiesta diretta sul browser dell'utente e utilizzare l'elaborazione locale per dare al file un vero nome ed estensione.
per realizzare che ho usato questo grande articolo da Henry Algus: http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/
1. Primo passo: Aggiungere il supporto binario a jQuery
/**
*
* jquery.binarytransport.js
*
* @description. jQuery ajax transport for making binary data type requests.
* @version 1.0
* @author Henry Algus <[email protected]>
*
*/
// 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 passo: Fai un 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 è possibile utilizzare il Blob creato come si vuole, nel mio caso voglio salvarlo su disco.
3. Opzionale: Salva file sul computer dell'utente utilizzando FileSaver
ho usato FileSaver.js per salvare su disco il file scaricato, se è necessario per realizzare questo, si prega di utilizzare questa libreria javascript:
https://github.com/eligrey/FileSaver.js/
mi aspetto questo per aiutare gli altri con esigenze più specifiche.
non importa sui due precedenti commenti: tutto ciò che devi fare è inviare un 'XMLHttpRequest' all'URL del blob. – gengkev
che bella domanda! –
Perché non memorizzare semplicemente gli oggetti del file originale da qualche parte, quindi utilizzare l'URL dell'oggetto per visualizzarli e sul modulo di invio utilizzare i file originali? – user764754