Konvertieren Sie den Blob in base64

140

Dies ist ein Ausschnitt für den Code, die ich tun möchte , Blobum Base64string:

Dieser kommentierte Teil funktioniert und wenn die von diesem generierte URL auf img src gesetzt ist, wird das Bild angezeigt:

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

Das Problem ist, dass mit dem unteren Code die generierte Quellvariable null ist

Aktualisieren:

Gibt es eine einfachere Möglichkeit, dies mit JQuery zu tun, um Base64-Zeichenfolgen aus der Blob-Datei wie im obigen Code erstellen zu können?

Quarks
quelle

Antworten:

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

Bilden Sie die Dokumentcodierungen readAsDataURL zu base64

Arun Killu
quelle
1
Der Ausgabe-String scheint nicht wie base64 auszusehen?
Quarks
1
@xybrek Wenn Sie read.result drucken, wird base64 in der Zeichenfolge selbst angezeigt.
Nawaf Alsulami
27
console.log (base64data.substr (base64data.indexOf (',') + 1));
Palota
9
onloadendsollte vorher kommen, readAsDataURLnur für den Fall, dass etwas Seltsames passiert und das Laden beendet ist, bevor es die nächste Codezeile erreicht. Natürlich würde dies niemals passieren, aber es ist immer noch eine gute Praxis.
3ozän
2
Diese Antwort ist falsch. Sie fügt Zeichen ohne Base64 an die Vorderseite der Zeichenfolge an.
Joshua Smith
28

das hat bei mir funktioniert:

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);
};
yeahdixon
quelle
Was ist das Argument cb?
Fellow Stranger
1
@FellowStranger häufig Rückruf, verwendet wie blobToBase64 (myBlob, Funktion (base64String) {/ * verwenden Sie den base64String * /}), weil es asynchron ist
Leonard Pauli
@yeahdixon, Scheint, ich brauche deine Hilfe. Schauen Sie sich das an: 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
quelle
Schön, @Vemonus, weil FileReader als base64 im Ergebnisattribut verfügbar gemacht wird, funktioniert perfekt.
Cami Rodriguez
6

Es gibt eine reine JavaSript-Methode, die nicht von Stapeln abhängt:

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

Um diese Hilfsfunktion zu verwenden, sollten Sie einen Rückruf festlegen, Beispiel:

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

Ich schreibe diese Hilfsfunktion für mein Problem im React Native-Projekt. Ich wollte ein Bild herunterladen und es dann als zwischengespeichertes Bild speichern:

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

oder

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

siehe Antwort Konstruktor können Sie drehen [blob, buffer source form data, readable stream, etc.]in Reaktion , die dann in gedreht werden kann , [json, text, array buffer, blob]mit Asynchron - Methode / Rückrufe.

edit: Wie @Ralph erwähnt hat, verursacht das Verwandeln von allem in eine utf-8-Zeichenfolge Probleme (leider bietet die Antwort-API keine Möglichkeit zum Konvertieren in eine binäre Zeichenfolge), sodass der Array-Puffer stattdessen als Zwischenstufe verwendet wird, was zwei weitere Schritte erfordert (Konvertieren in Byte-Array DANN zu Binärzeichenfolge), wenn Sie darauf bestehen, die native btoaMethode zu verwenden.

Valen
quelle
.text () decodiert mit UTF8. Was passiert, wenn die Antwort Binärcode enthält? Ich glaube, dass dies für Nicht-Textdaten fehlschlagen wird
Ralph
Ich verstehe Ihren Standpunkt, habe die Antwort geändert (es wird jedoch ziemlich langwierig). An diesem Punkt wäre es besser, nicht darauf zu bestehenbtoa
Valen
4

Sie können das Problem beheben, indem Sie:

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

Ich hoffe das hilft dir

Ali Sadri
quelle
4

Das Problem ist also, dass Sie ein Basis-64-Image hochladen möchten und eine Blob-URL haben. Die Antwort, die auf allen HTML 5-Browsern funktioniert, lautet: Do:

  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
quelle
-2

Der einfachste Weg in einer einzigen Codezeile

var base64Image = neuer Puffer (Blob, 'binär') .toString ('base64');

Vishnu IT
quelle
18
Da diese Antwort Knoten-APIs verwendet und daher die ursprüngliche Frage zu Blob (Browser-API) nicht beantwortet.
RReverser
Was ist Puffer?
IntoTheDeep
1
Ich erhalte Uncaught TypeError: Das erste Argument muss eine Zeichenfolge, ein Puffer, ein ArrayBuffer, ein Array oder ein Array-ähnliches Objekt sein.
Falscher
@ TeodorKolev es ist spezifisch für Node.js
Jader Dias