¿Blob de DataURL?

Resuelto Shane Holloway asked hace 12 años • 11 respuestas

Usando FileReader's readAsDataURL()puedo transformar datos arbitrarios en una URL de datos. ¿Existe alguna forma de volver a convertir una URL de datos en una Blobinstancia utilizando las API integradas del navegador?

Shane Holloway avatar Aug 29 '12 06:08 Shane Holloway
Aceptado

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 ayudarle

EDITAR: Como informaron algunos comentaristas, BlobBuilder quedó 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;

}
devnull69 avatar Sep 06 '2012 12:09 devnull69

Como el método @Adria pero con Fetch api y solo más pequeño [ caniuse? ]
No es necesario pensar en el tipo MIME, ya que el tipo de respuesta blob simplemente funciona de inmediato.

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))
Expandir fragmento

No creas que podrías hacerlo más pequeño que esto sin usar lib's

Endless avatar Mar 23 '2016 16:03 Endless

En los navegadores modernos se puede utilizar la línea sugerida por Christian d'Heureuse en un comentario:

const blob = await (await fetch(dataURI)).blob(); 
Jan Derk avatar Jul 01 '2020 13:07 Jan Derk