Convertir blob a base64


140

Este es un fragmento del código que quiero hacer Blobpara Base64encadenar:

Esta parte comentada funciona y cuando la URL generada por esto se establece en img src, muestra la imagen:

var blob = items[i].getAsFile();
//var URLObj = window.URL || window.webkitURL;
//var source = URLObj.createObjectURL(blob);
//console.log("image source=" + source);

var reader = new FileReader();
reader.onload = function(event){
console.log(event.target.result)
}; // data url!
var source = reader.readAsBinaryString(blob);

El problema es con el código inferior, la variable fuente generada es nula

Actualizar:

¿Hay una manera más fácil de hacer esto con JQuery para poder crear una cadena Base64 a partir del archivo Blob como en el código anterior?

Respuestas:


273
 var reader = new FileReader();
 reader.readAsDataURL(blob); 
 reader.onloadend = function() {
     var base64data = reader.result;                
     console.log(base64data);
 }

Forma los documentos readAsDataURL codifica a base64


1
¿La cadena de salida no parece ser base64?
— quarks

1
@xybrek Si imprime read.result, verá base64 en la cadena misma.
— Nawaf Alsulami

27
console.log (base64data.substr (base64data.indexOf (',') + 1));
— palota

9
onloadenddebería aparecer antes readAsDataURLen caso de que ocurra algo extraño y termine de cargarse antes de llegar a la siguiente línea de código. Obviamente esto nunca sucedería, pero sigue siendo una buena práctica.
— 3ocene

2
Esta respuesta es incorrecta, agrega caracteres no base64 al frente de la cadena.
— Joshua Smith el

28

esto funcionó para mí:

var blobToBase64 = function(blob, callback) {
    var reader = new FileReader();
    reader.onload = function() {
        var dataUrl = reader.result;
        var base64 = dataUrl.split(',')[1];
        callback(base64);
    };
    reader.readAsDataURL(blob);
};

¿Cuál es el argumento cb?
— Compañero extraño

1
@FellowStranger comúnmente devolución de llamada, utilizada como blobToBase64 (myBlob, function (base64String) {/ * use base64String * /}), porque es asíncrono
— Leonard Pauli

@yeahdixon, parece que necesito tu ayuda. Mira esto: stackoverflow.com/questions/46192069/…
— Success Man

7
var audioURL = window.URL.createObjectURL(blob);
audio.src = audioURL;

var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function () {
     base64data = reader.result;
     console.log(base64data);
}

Bien, @Vemonus porque FileReader expone en atributo de resultado como base64, funciona perfectamente.
— Cami Rodriguez

6

Hay una forma pura de JavaSript que no depende de ninguna pila:

const blobToBase64 = blob => {
  const reader = new FileReader();
  reader.readAsDataURL(blob);
  return new Promise(resolve => {
    reader.onloadend = () => {
      resolve(reader.result);
    };
  });
};

Para usar esta función auxiliar, debe establecer una devolución de llamada, por ejemplo:

blobToBase64(blobData).then(res => {
  // do what you wanna do
  console.log(res); // res is base64 now
});

Escribo esta función auxiliar para mi problema en el proyecto React Native, quería descargar una imagen y luego almacenarla como una imagen en caché:

fetch(imageAddressAsStringValue)
  .then(res => res.blob())
  .then(blobToBase64)
  .then(finalResult => { 
    storeOnMyLocalDatabase(finalResult);
  });

5
function bufferToBinaryString(arrayBuffer){
    return String.fromCharCode(...new Uint8Array(arrayBuffer));
}
(async () => console.log(btoa(bufferToBinaryString(await new Response(blob).arrayBuffer()))))();

o

function bufferToBinaryString(arrayBuffer){
    return String.fromCharCode(...new Uint8Array(arrayBuffer));
}
new Response(blob).arrayBuffer().then(arr_buf => console.log(btoa(bufferToBinaryString(arr_buf)))))

vea el constructor de Response , puede convertirlo [blob, buffer source form data, readable stream, etc.]en Response , que luego se puede convertir [json, text, array buffer, blob]con método asíncrono / devoluciones de llamada.

editar: como mencionó @Ralph, convertir todo en una cadena utf-8 causa problemas (desafortunadamente, la API de respuesta no proporciona una forma de convertir a una cadena binaria), por lo que el búfer de matriz se usa como intermedio, lo que requiere dos pasos más (convertirlo a matriz de bytes ENTONCES a cadena binaria), si insiste en usar el btoamétodo nativo .


.text () decodifica usando UTF8, ¿qué sucede si la respuesta tiene código binario? Creo que esto fallará para los datos que no son de texto
— Ralph

Veo su punto, modificó la respuesta (aunque se vuelve bastante larga). En este punto, sería mejor no insistir enbtoa
— Valen

4

Puedes solucionar el problema:

var canvas = $('#canvas'); 
var b64Text = canvas.toDataURL();
b64Text = b64Text.replace('data:image/png;base64,','');
var base64Data = b64Text;

Espero que esto te ayude


4

Entonces, el problema es que desea cargar una imagen base 64 y tiene una URL de blob. Ahora la respuesta que funcionará en todos los navegadores html 5 es: Hacer:

  var fileInput = document.getElementById('myFileInputTag');
  var preview = document.getElementById('myImgTag');

  fileInput.addEventListener('change', function (e) {
      var url = URL.createObjectURL(e.target.files[0]);
      preview.setAttribute('src', url);
  });
function Upload()
{
     // preview can be image object or image element
     var myCanvas = document.getElementById('MyCanvas');
     var ctx = myCanvas.getContext('2d');
     ctx.drawImage(preview, 0,0);
     var base64Str = myCanvas.toDataURL();
     $.ajax({
         url: '/PathToServer',
         method: 'POST',
         data: {
             imageString: base64Str
         },
     success: function(data) { if(data && data.Success) {}},
     error: function(a,b,c){alert(c);}
     });
 }

0

Quería algo donde tuviera acceso al valor de base64 para almacenar en una lista y para mí, agregar oyente de eventos funcionó. Solo necesita FileReader, que leerá el blob de imágenes y devolverá el base64 en el resultado.

createImageFromBlob(image: Blob) {
    const reader = new FileReader();
    const supportedImages = []; // you can also refer to some global variable
    reader.addEventListener(
      'load',
      () => {
        // reader.result will have the required base64 image
        const base64data = reader.result;
        supportedImages.push(base64data); // this can be a reference to global variable and store the value into that global list so as to use it in the other part
      },
      false
    );
    // The readAsDataURL method is used to read the contents of the specified Blob or File.
    if (image) {
      reader.readAsDataURL(image);
    }
 }

La parte final es readAsDataURL, que es muy importante para leer el contenido del Blob especificado.


-2

La forma más fácil en una sola línea de código

var base64Image = new Buffer (blob, 'binario') .toString ('base64');


18
Debido a que esta respuesta usa API de nodo y no responde la pregunta original sobre Blob (API de navegador).
— RReverser

¿Qué es el buffer?
— IntoTheDeep

1
Obtengo TypeError no capturado: el primer argumento debe ser una cadena, Buffer, ArrayBuffer, Array u objeto tipo matriz.
— Incorrecto

@TeodorKolev es específico de Node.js
— Jader Dias
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.