Convertir le blob en base64

140

Ceci est un extrait du code que je veux faire Blobpour Base64string:

Cette partie commentée fonctionne et que lorsque l'URL générée par ceci est définie sur img src, elle affiche l'image:

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

Le problème est avec le code inférieur, la variable source générée est nulle

Mettre à jour:

Existe-t-il un moyen plus simple de le faire avec JQuery pour pouvoir créer une chaîne Base64 à partir d'un fichier Blob comme dans le code ci-dessus?

quarks
la source

Réponses:

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

Former les documents readAsDataURL encodés en base64

Arun Killu
la source
1
La chaîne de sortie ne semble pas ressembler à base64?
quarks
1
@xybrek Si vous imprimez read.result, vous verrez base64 dans la chaîne elle-même.
Nawaf Alsulami
27
console.log (base64data.substr (base64data.indexOf (',') + 1));
palota
9
onloadenddevrait venir avant readAsDataURLjuste au cas où quelque chose de bizarre se produirait et que le chargement se termine avant d'atteindre la ligne de code suivante. Évidemment, cela n'arriverait jamais mais c'est toujours une bonne pratique.
3ocène
2
Cette réponse est incorrecte, elle ajoute des caractères sans base64 au début de la chaîne.
Joshua Smith
28

cela a fonctionné pour moi:

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);
};
ouaisdixon
la source
Quel est l'argument cb?
Fellow Stranger
1
@FellowStranger communément callback, utilisé comme blobToBase64 (myBlob, function (base64String) {/ * use the base64String * /}), car il est asynchrone
Leonard Pauli
@yeahdixon, il semble que j'ai besoin de votre aide. Regardez ceci: 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);
}
zinsat
la source
Bien, @Vemonus car FileReader expose dans l'attribut résultat en base64, fonctionne parfaitement.
Cami Rodriguez
7

Il existe une méthode JavaSript pure qui ne dépend d'aucune pile:

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

Pour utiliser cette fonction d'assistance, vous devez définir un rappel, par exemple:

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

J'écris cette fonction d'aide pour mon problème sur le projet React Native, je voulais télécharger une image puis la stocker en tant qu'image en cache:

fetch(imageAddressAsStringValue)
  .then(res => res.blob())
  .then(blobToBase64)
  .then(finalResult => { 
    storeOnMyLocalDatabase(finalResult);
  });
AmerllicA
la source
5
function bufferToBinaryString(arrayBuffer){
    return String.fromCharCode(...new Uint8Array(arrayBuffer));
}
(async () => console.log(btoa(bufferToBinaryString(await new Response(blob).arrayBuffer()))))();

ou

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

voir le constructeur de Response , vous pouvez le transformer [blob, buffer source form data, readable stream, etc.]en Response , qui peut ensuite être transformé en [json, text, array buffer, blob]avec la méthode async / les rappels.

edit: comme @Ralph l'a mentionné, transformer tout en chaîne utf-8 pose des problèmes (malheureusement l'API Response ne fournit pas un moyen de conversion en chaîne binaire), donc le tampon de tableau est utilisé à la place comme intermédiaire, ce qui nécessite deux étapes supplémentaires (le convertir en byte array THEN en chaîne binaire), si vous insistez sur l'utilisation de la btoaméthode native .

Valen
la source
.text () décode en utilisant UTF8, que se passe-t-il si la réponse a du code binaire? Je crois que cela échouera pour les données non textuelles
Ralph le
Je vois votre point, amendé la réponse (cela devient cependant assez long). À ce stade, il serait préférable de ne pas insister surbtoa
Valen
4

vous pouvez résoudre le problème en:

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

J'espère que cela vous aidera

Ali Sadri
la source
4

Donc, le problème est que vous souhaitez télécharger une image de base 64 et que vous avez une URL blob. Maintenant, la réponse qui fonctionnera sur tous les navigateurs html 5 est: Faites:

  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);}
     });
 }
AW
la source
1

Je voulais quelque chose où j'ai accès à la valeur base64 pour stocker dans une liste et pour moi l'ajout d'un écouteur d'événements a fonctionné. Vous avez juste besoin du FileReader qui lira le blob d'image et retournera le base64 dans le résultat.

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 dernière partie est le readAsDataURL qui est très important est utilisé pour lire le contenu de l'objet blob spécifié

Asif Karim Bherani
la source
-2

Le moyen le plus simple en une seule ligne de code

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

Vishnu IT
la source
18
Parce que cette réponse utilise les API Node et ne répond donc pas à la question d'origine sur Blob (API du navigateur).
RReverser
Qu'est-ce que Buffer?
IntoTheDeep
1
J'obtiens Uncaught TypeError: Le premier argument doit être une chaîne, un Buffer, un ArrayBuffer, un Array ou un objet de type tableau.
Mauvais
@TeodorKolev c'est spécifique à Node.js
Jader Dias