Usando FileReader
's readAsDataURL()
puedo transformar datos arbitrarios en una URL de datos. ¿Hay alguna forma de volver a convertir una URL de datos en una Blob
instancia utilizando apis de navegador integradas?
javascript
fileapi
Shane Holloway
fuente
fuente
Como el método @Adria pero con Fetch api y un [ caniuse? ]
No tiene que pensar en mimetype ya que el tipo de respuesta de blob simplemente funciona de inmediato
var url = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" fetch(url) .then(res => res.blob()) .then(blob => console.log(blob))
No creas que podrías hacerlo más pequeño que esto sin usar lib's
fuente
const blob = await (await fetch(url)).blob();
fetch
es que obliga a tener una API asíncrona.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 es Data URL y dataTYPE es el tipo de archivo y luego el objeto blob de salida
fuente
dataTYPE
está incrustado endataURI
y por lo tanto deben ser analizados como en la primera respuesta.Método basado en 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 ); });
fuente
En los navegadores modernos, se puede usar el delineador sugerido por Christian d'Heureuse en un comentario:
const blob = await (await fetch(dataURI)).blob();
fuente
tratar:
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 }); }
fuente
Cree un blob con la 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 ); });
fuente
Use mi código para convertir dataURI en blob. Es más simple y más limpio que otros.
function dataURItoBlob(dataURI) { var arr = dataURI.split(','), mime = arr[0].match(/:(.*?);/)[1]; return new Blob([atob(arr[1])], {type:mime}); }
fuente
Dado que ninguna de estas respuestas admite dataURL base64 y no base64, aquí hay una que sí se basa en la respuesta eliminada 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}) } }
Nota: No estoy seguro de si hay otros tipos de mime de dataURL que podrían tener que manejarse de manera diferente. ¡Pero avíseme si se entera! Es posible que dataURL simplemente tenga cualquier formato que deseen, y en ese caso dependerá de usted encontrar el código correcto para su caso de uso particular.
fuente
utilizar
más bien que
fuente
ArrayBuffer
ruta alternativa no funcionará.