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?
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?
Respuestas:
El usuario Matt propuso el siguiente código hace un año ( ¿Cómo convertir dataURL en un objeto de archivo en javascript? ) Que podría ayudarlo
EDITAR: Como informaron algunos comentaristas, BlobBuilder ha quedado obsoleto hace algún tiempo. Este es el código actualizado:
function dataURItoBlob(dataURI) {
// convert base64 to raw binary data held in a string
// doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
var byteString = atob(dataURI.split(',')[1]);
// separate out the mime component
var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]
// write the bytes of the string to an ArrayBuffer
var ab = new ArrayBuffer(byteString.length);
// create a view into the buffer
var ia = new Uint8Array(ab);
// set the bytes of the buffer to the correct values
for (var i = 0; i < byteString.length; i++) {
ia[i] = byteString.charCodeAt(i);
}
// write the ArrayBuffer to a blob, and you're done
var blob = new Blob([ab], {type: mimeString});
return blob;
}
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
Advertencia: puede violar la Política de seguridad de contenido (CSP)
... si usa ese material
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
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
dataTYPE
está incrustado en dataURI
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 );
});
En los navegadores modernos, se puede usar el delineador sugerido por Christian d'Heureuse en un comentario:
const blob = await (await fetch(dataURI)).blob();
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
});
}
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 );
});
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});
}
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.
utilizar
FileReader.readAsArrayBuffer(Blob|File)
más bien que
FileReader.readAsDataURL(Blob|File)
ArrayBuffer
ruta alternativa no funcionará.