Перетворити блоб на базу64


140

Це фрагмент коду, який я хочу зробити Blobдля Base64рядка:

Ця коментована частина працює, і коли створена цим URL-адресом встановлено img src, вона відображає зображення:

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

Проблема полягає в нижчому коді, згенерована змінна джерела - нульова

Оновлення:

Чи є простіший спосіб зробити це за допомогою JQuery, щоб мати можливість створити Base64 String з файлу Blob, як у наведеному вище коді?

Відповіді:


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

Формуємо DOCS readAsDataURL кодує в base64


1
Вихідний рядок не схожий на base64?
кварки

1
@xybrek Якщо ви надрукуєте read.result, ви побачите base64 у самому рядку.
Nawaf Alsulami

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

9
onloadendслід прийти раніше, readAsDataURLна випадок, якщо трапиться щось дивне, і воно закінчується завантаженням до того, як досягне наступного рядка коду. Очевидно, це ніколи не відбудеться, але це все-таки хороша практика.
3оцен

2
Ця відповідь неправильна, вона додає символи, які не знаходяться на базі64, на передній частині рядка.
Джошуа Сміт

28

це працювало для мене:

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

Що таке аргумент cb?
Непознаний незнайомець

1
@FellowStranger зазвичай зворотний виклик, використовується як blobToBase64 (myBlob, функція (base64String) {/ * використовуйте base64String * /}), тому що це асинхроніка
Леонард Паулі

@yeahdixon, Здається, мені потрібна ваша допомога. Подивіться на це: stackoverflow.com/questions/46192069/…
Людина успіху

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

Приємно, @Vemonus, оскільки FileReader виставляє атрибут результату як base64, працює чудово.
Камі Родрігес

7

Існує чистий спосіб JavaSript, який не залежить від жодних стеків:

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

Для використання цієї допоміжної функції слід встановити зворотний дзвінок, наприклад:

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

Я пишу цю допоміжну функцію для своєї проблеми в проекті React Native, я хотів завантажити зображення, а потім зберегти його як кешоване зображення:

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

або

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

див . конструктор Response , ви можете перетворитись [blob, buffer source form data, readable stream, etc.]у Response , який потім можна перетворити на [json, text, array buffer, blob]метод асинхронізації / зворотний виклик.

редагувати: як згадував @Ralph, перетворення всього в рядок utf-8 спричиняє проблеми (на жаль, API Response не забезпечує спосіб перетворення в двійкову рядок), тому буфер масиву використовується замість цього проміжного, для чого потрібні ще два кроки (перетворення його в байтовий масив ТОГО у двійковий рядок), якщо ви наполягаєте на використанні нативного btoaметоду.


.text () декодує за допомогою UTF8, що станеться, якщо у відповіді є двійковий код? Я вірю, що це не вдасться для нетекстових даних
Ральф

Я бачу вашу думку, відповідь змінила (хоча вона стає досить тривалою). У цей момент було б краще не наполягатиbtoa
Вален

4

Ви можете вирішити проблему:

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

Я сподіваюся, що це допоможе тобі


4

Отже, проблема полягає в тому, що ви хочете завантажити базове зображення 64 і у вас є URL-адреса краплі. Тепер відповідь, яка буде працювати у всіх браузерах html 5:

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

1

Мені хотілося чогось, де я маю доступ до значення base64, щоб зберігати його в списку, і для мене додався слухач подій. Вам просто потрібен FileReader, який прочитає зображення блобу і поверне base64 в результаті.

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

Заключна частина - readAsDataURL, що дуже важливо, що використовується для зчитування вмісту вказаного Blob


-2

Найпростіший спосіб в одному рядку коду

var base64Image = новий буфер (blob, 'binary') .toString ('base64');


18
Оскільки у цій відповіді використовуються API Node і тому не відповідає на початкове запитання про Blob (API браузера).
RReverser

Що таке буфер?
IntoTheDeep

1
Я отримую Uncaught TypeError: Першим аргументом повинен бути рядок, буфер, ArrayBuffer, Array або об’єкт, схожий на масив.
Неправильно

@TeodorKolev це специфічно для Node.js
Jader Dias
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.