En utilisant FileReader
's, readAsDataURL()
je peux transformer des données arbitraires en une URL de données. Existe-t-il un moyen de reconvertir une URL de données en une Blob
instance à l'aide des API de navigateur intégrées?
javascript
fileapi
Shane Holloway
la source
la source
Comme la méthode @Adria mais avec Fetch api et juste plus petit [ caniuse? ]
Pas besoin de penser au type MIME, car le type de réponse blob fonctionne immédiatement
var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" fetch(url) .then(res => res.blob()) .then(blob => console.log(blob))
Ne pensez pas que vous pourriez le faire plus petit que cela sans utiliser les lib
la source
const blob = await (await fetch(url)).blob();
fetch
est qu'il est forcé d'avoir une API asynchrone.dataURItoBlob : function(dataURI, dataTYPE) { var binary = atob(dataURI.split(',')[1]), array = []; for(var i = 0; i < binary.length; i++) array.push(binary.charCodeAt(i)); return new Blob([new Uint8Array(array)], {type: dataTYPE}); }
input dataURI est l'URL de données et dataTYPE est le type de fichier, puis l'objet blob de sortie
la source
dataTYPE
est intégrédataURI
et doit donc être analysé comme dans la première réponse.Méthode basée sur XHR.
function dataURLtoBlob( dataUrl, callback ) { var req = new XMLHttpRequest; req.open( 'GET', dataUrl ); req.responseType = 'arraybuffer'; // Can't use blob directly because of https://crbug.com/412752 req.onload = function fileLoaded(e) { // If you require the blob to have correct mime type var mime = this.getResponseHeader('content-type'); callback( new Blob([this.response], {type:mime}) ); }; req.send(); } dataURLtoBlob( 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==', function( blob ) { console.log( blob ); });
la source
Dans les navigateurs modernes, on peut utiliser le seul liner suggéré par Christian d'Heureuse dans un commentaire:
const blob = await (await fetch(dataURI)).blob();
la source
essayer:
function dataURItoBlob(dataURI) { if(typeof dataURI !== 'string'){ throw new Error('Invalid argument: dataURI must be a string'); } dataURI = dataURI.split(','); var type = dataURI[0].split(':')[1].split(';')[0], byteString = atob(dataURI[1]), byteStringLength = byteString.length, arrayBuffer = new ArrayBuffer(byteStringLength), intArray = new Uint8Array(arrayBuffer); for (var i = 0; i < byteStringLength; i++) { intArray[i] = byteString.charCodeAt(i); } return new Blob([intArray], { type: type }); }
la source
Créez un objet blob à l'aide de l' API XHR :
function dataURLtoBlob( dataUrl, callback ) { var req = new XMLHttpRequest; req.open( 'GET', dataUrl ); req.responseType = 'blob'; req.onload = function fileLoaded(e) { callback(this.response); }; req.send(); } var dataURI = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==' dataURLtoBlob(dataURI , function( blob ) { console.log( blob ); });
la source
Utilisez mon code pour convertir dataURI en blob. C'est plus simple et plus propre que d'autres.
function dataURItoBlob(dataURI) { var arr = dataURI.split(','), mime = arr[0].match(/:(.*?);/)[1]; return new Blob([atob(arr[1])], {type:mime}); }
la source
Étant donné qu'aucune de ces réponses ne prend en charge les URL de données base64 et non base64, en voici une basée sur la réponse supprimée de vuamitom:
// from /programming/37135417/download-canvas-as-png-in-fabric-js-giving-network-error/ var dataURLtoBlob = exports.dataURLtoBlob = function(dataurl) { var parts = dataurl.split(','), mime = parts[0].match(/:(.*?);/)[1] if(parts[0].indexOf('base64') !== -1) { var bstr = atob(parts[1]), n = bstr.length, u8arr = new Uint8Array(n) while(n--){ u8arr[n] = bstr.charCodeAt(n) } return new Blob([u8arr], {type:mime}) } else { var raw = decodeURIComponent(parts[1]) return new Blob([raw], {type: mime}) } }
Remarque: je ne suis pas sûr s'il existe d' autres types mime dataURL qui pourraient devoir être traités différemment. Mais faites-le moi savoir si vous le découvrez! Il est possible que les dataURL puissent simplement avoir le format de leur choix, et dans ce cas, ce serait à vous de trouver le bon code pour votre cas d'utilisation particulier.
la source
utilisation
plutôt que
la source
ArrayBuffer
chemin alternatif ne fonctionnera pas.