var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://static.reddit.com/reddit.com.header.png', true);
xhr.responseType = 'arraybuffer';
xhr.onload = function(e) {
if (this.status == 200) {
var uInt8Array = new Uint8Array(this.response);
var byte3 = uInt8Array[4];
var bb = new WebKitBlobBuilder();
bb.append(xhr.response);
var blob = bb.getBlob('image/png');
var base64 = window.btoa(blob);
alert(base64);
}
};
xhr.send();
Fondamentalement, ce que j'essaie de faire ici est de récupérer une image et de la convertir en base64.
En lisant les commentaires ici , il indique "Bien sûr. Après avoir récupéré une ressource en tant que ArrayBuffer, créez-en un blob. Une fois que vous avez cela, vous pouvez coder en base64 le fichier/blob directement (fenêtre. btoa ()) ou FileReader.readAsDataURL (). "
Cependant, blob
est juste [objet blob], alors que j'ai besoin d'obtenir le binaire de l'image pour pouvoir le convertir en base64 et l'afficher dans une balise img en utilisant des données:
Quelqu'un sait comment y parvenir?
Merci d'avance!
N'utilisez pas BlobBuilder dans Chrome (testé dans OSX Chrome, Firefox 12, Safari 6, iOS Chrome, iOS Safari):
ex1: http://jsfiddle.net/malraux/xGUsu/ (principe)
ex2: http://jsfiddle.net/xGUsu/78/ (travailler avec un exemple complet)
var xhr = new XMLHttpRequest();
xhr.open('GET', 'doodle.png', true);
xhr.responseType = 'arraybuffer';
// Process the response when the request is ready.
xhr.onload = function(e) {
if (this.status == 200) {
// Create a binary string from the returned data, then encode it as a data URL.
var uInt8Array = new Uint8Array(this.response);
var i = uInt8Array.length;
var binaryString = new Array(i);
while (i--)
{
binaryString[i] = String.fromCharCode(uInt8Array[i]);
}
var data = binaryString.join('');
var base64 = window.btoa(data);
document.getElementById("myImage").src="data:image/png;base64," + base64;
}
};
xhr.send();
Remarque : Ce code a plus de 7 ans à ce stade. Bien qu'il devrait toujours fonctionner dans la plupart des navigateurs, voici une version mise à jour basée sur une suggestion de @TypeError qui ne fonctionnera que dans les navigateurs plus modernes à l'exception possible d'iOS Safari (qui peut ou non prendre en charge responseType = 'blob'
- assurez-vous de tester!):
var xhr = new XMLHttpRequest();
xhr.open('get', 'doodle.png', true);
// Load the data directly as a Blob.
xhr.responseType = 'blob';
xhr.onload = () => {
document.querySelector('#myimage').src = URL.createObjectURL(this.response);
};
xhr.send();
Vous pouvez récupérer un Blob
et utiliser window.URL.createObjectURL
. Cela empêche de construire des chaînes géantes et de tout copier plusieurs fois.
var xhr = new XMLHttpRequest();
xhr.open('GET', 'https://i.imgur.com/sBJOoTm.png', true);
xhr.responseType = 'blob';
xhr.onload = function(e) {
if (this.status == 200) {
var blob = this.response;
document.getElementById("myImage").src = window.URL.createObjectURL(blob);
}
};
xhr.onerror = function(e) {
alert("Error " + e.target.status + " occurred while receiving the document.");
};
xhr.send();
<img id="myImage">
Exemple (même code): http://jsfiddle.net/ysangkok/sJxXk/86/ . Fonctionne dans Firefox et Chrome 25+. Et tous les autres navigateurs sauf Opera Mini: http://caniuse.com/#search=Blob)
var xmlhttp = new XMLHttpRequest();
xmlhttp.open('GET', 'http://RestServiceURL-Returns Image', true);
xmlhttp.setRequestHeader('Content-type','application/x-www-form-urlencoded');
xmlhttp.responseType = 'arraybuffer/blob';
xmlhttp.send();
création d'image blob de 3 manières.
xmlhttp.onload = function() {
var blob = new Blob([this.response], {type: 'image/png'});
console.log(blob, blob.type, this.response, typeof this.response);
var image = document.getElementById('my-image');
1)image.src = window.URL.createObjectURL(blob);
2)var fileReader = new window.FileReader();
fileReader.readAsDataURL(blob);
fileReader.onloadend = function() {
image.src = fileReader.result;
}
3)var base64String = btoa(String.fromCharCode.apply(null, new Uint8Array(this.response)));
image.src = 'data:image/png;base64,'+base64String;
};
Conversion d'ArrayBuffer en Blob en ArrayBuffer
1)var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
2)fileReader.readAsArrayBuffer(blob);
var arrayBuffer;
fileReader.onload = function() {
arrayBuffer = this.result;
};
Même solution que celle suggérée par Janus Troelsen avec promesse ajoutée ...
Remarque! lors de l'utilisation de createObjectURL - n'oubliez pas d'appeler revokeObjectURL
// Load blob (promise)
function loadBlob( url ){
return new Promise( (resolve, reject) => {
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.onload = () => resolve(xhr.response);
xhr.onerror = () => reject(xhr.statusText);
xhr.send();
});
}
// Create image from blob (createObjectURL)
function imageFromBlob( blob ){
const img = new Image();
img.onload = () => URL.revokeObjectURL(img.src);
img.src = URL.createObjectURL(blob);
return img;
}
// Create image from blob if loaded successfully
loadBlob('https://unsplash.it/960/540?random')
.then( blob => {
document.body.appendChild( imageFromBlob(blob) );
})
.catch( error => {
console.log('Could not load image');
})
// Alternate version adding promise to xhr
// if you like to trigger xhr.send() yourself
function xhrBlob(url){
const xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
xhr.responseType = 'blob';
xhr.promise = new Promise((resolve, reject) => {
xhr.onload = () => resolve(xhr.response);
xhr.onerror = () => reject(xhr.statusText);
});
xhr.load = ( onsuccess = () => {}, onerror = () => {} ) => {
xhr.promise.then(onsuccess).catch(onerror);
xhr.send();
return xhr;
}
return xhr;
}
// Using load callbacks
xhrBlob('https://unsplash.it/960/540?random')
.load(
// on sussess
blob => {
document.body.appendChild( imageFromBlob(blob) );
},
// on error
error => {
console.log('Could not load image');
}
);
// Using promise (delayed)
const image = xhrBlob('https://unsplash.it/960/540?random');
// Promise handlers
image.promise
.then( blob => {
document.body.appendChild( imageFromBlob(blob) );
})
.catch( error => {
console.log('Could not load image');
});
// Load image (will trigger promise handlers)
setTimeout(image.load, 3000);
img {
width: 100%;
}