online link example createobjecturl javascript fileapi

javascript - link - Blob de DataURL?



link href window url createobjecturl blob); (8)

Utilizando FileReader readAsDataURL() puedo transformar datos arbitrarios en una URL de datos. ¿Hay alguna manera de convertir una URL de datos de nuevo en una instancia de Blob utilizando las aplicaciones del navegador incorporado?


Dado que ninguna de estas respuestas es compatible con dataURL base64 y no base64, aquí hay una que se basa en la respuesta eliminada de vuamitom:

// from https://.com/questions/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 por favor avíseme si lo descubre! Es posible que los dataURL simplemente tengan cualquier formato que deseen, y en ese caso depende de usted encontrar el código correcto para su caso de uso particular.


El usuario Matt ha propuesto el siguiente código hace un año ( ¿Cómo convertir dataURL a un objeto de archivo en javascript? ) Que podría ayudarte

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; }


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 ); });


Me gusta el método @Adria pero con Fetch api y solo más pequeño [ caniuse? ]
No tiene que pensar en el tipo mimet ya que el tipo de respuesta blob simplemente funciona de la caja

Advertencia: puede violar la Política de seguridad de contenido (CSP)
... si usas esas cosas

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


Usa mi código para convertir dataURI a 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}); }


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 }); }


utilizar

FileReader.readAsArrayBuffer(Blob|File)

más bien que

FileReader.readAsDataURL(Blob|File)


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 output blob object