Ubah gumpalan ke base64

140

Ini adalah cuplikan untuk kode yang ingin saya lakukan Blobuntuk Base64merangkai:

Bagian yang dikomentari ini berfungsi dan ketika URL yang dihasilkan oleh ini disetel ke img src, ia akan menampilkan gambar:

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

Masalahnya adalah dengan kode yang lebih rendah, variabel sumber yang dihasilkan adalah nol

Memperbarui:

Apakah ada cara yang lebih mudah untuk melakukan ini dengan JQuery untuk dapat membuat Base64 String dari file Blob seperti pada kode di atas?

quark
sumber

Jawaban:

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

Bentuk dokumen yang readAsDataURL dikodekan ke base64

Arun Killu
sumber
1
Output String tampaknya tidak terlihat seperti base64?
quark
1
@xybrek Jika Anda mencetak read.result, Anda akan melihat base64 di string itu sendiri.
Nawaf Alsulami
27
console.log (base64data.substr (base64data.indexOf (',') + 1));
palota
9
onloadendharus datang sebelum readAsDataURLkalau-kalau terjadi sesuatu yang aneh dan selesai memuat sebelum mencapai baris kode berikutnya. Jelas ini tidak akan pernah terjadi tetapi masih merupakan praktik yang baik.
3ocene
2
Jawaban ini salah, ia menambahkan karakter no-base64 ke bagian depan string.
Joshua Smith
28

ini bekerja untuk saya:

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
sumber
Apa argumennya cb?
Fellow Stranger
1
@FellowStranger biasanya dipanggil kembali, digunakan seperti blobToBase64 (myBlob, function (base64String) {/ * gunakan base64String * /}), karena async
Leonard Pauli
@yeahdixon, Sepertinya saya butuh bantuan Anda. Lihat ini: 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
sumber
Bagus, @Vemonus karena FileReader mengekspos atribut hasil sebagai base64, berfungsi dengan baik.
Cami Rodriguez
6

Ada cara JavaSript murni yang tidak bergantung pada tumpukan:

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

Untuk menggunakan fungsi pembantu ini Anda harus menetapkan panggilan balik, contoh:

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

Saya menulis fungsi pembantu ini untuk masalah saya pada proyek React Native, saya ingin mengunduh gambar dan kemudian menyimpannya sebagai gambar cache:

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

atau

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

lihat konstruktor Response , Anda dapat berubah [blob, buffer source form data, readable stream, etc.]menjadi Respons , yang kemudian dapat diubah menjadi [json, text, array buffer, blob]dengan metode / panggilan balik async.

sunting: seperti yang disebutkan @Ralph, mengubah semuanya menjadi utf-8 string menyebabkan masalah (sayangnya API Respons tidak menyediakan cara untuk mengubah ke string biner), jadi buffer array digunakan sebagai perantara, yang membutuhkan dua langkah lagi (mengubahnya menjadi byte array LALU ke string biner), jika Anda bersikeras menggunakan btoametode asli .

Valen
sumber
.text () menerjemahkan menggunakan UTF8, apa yang terjadi jika responsnya memiliki kode biner? Saya percaya ini akan gagal untuk data non-teks
Ralph
Saya mengerti maksud Anda, mengubah jawabannya (menjadi cukup panjang). Pada titik ini akan lebih baik untuk tidak bersikerasbtoa
Valen
4

Anda dapat memperbaiki masalah dengan:

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

Saya harap ini membantu Anda

Ali Sadri
sumber
4

Jadi masalahnya adalah Anda ingin mengunggah gambar basis 64 dan Anda memiliki url gumpalan. Sekarang jawaban yang akan bekerja pada semua browser html 5 adalah: 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
sumber
0

Saya ingin sesuatu di mana saya memiliki akses ke nilai base64 untuk disimpan ke dalam daftar dan bagi saya menambahkan pendengar acara bekerja. Anda hanya perlu FileReader yang akan membaca gumpalan gambar dan mengembalikan base64 di hasilnya.

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

Bagian terakhir adalah readAsDataURL yang sangat penting digunakan untuk membaca konten Blob yang ditentukan

Asif Karim Bherani
sumber
-2

Cara termudah dalam satu baris kode

var base64Image = Buffer baru (gumpalan, 'biner') .toString ('base64');

Wisnu ITU
sumber
18
Karena jawaban ini menggunakan Node API dan karenanya tidak menjawab pertanyaan awal tentang Blob (browser API).
RReverser
Apa itu Buffer?
IntoTheDeep
1
Saya mendapatkan UnEught TypeError: Argumen pertama harus berupa string, Buffer, ArrayBuffer, Array, atau objek mirip array.
Salah
@TeodorKolev khusus untuk Node.js
Jader Dias