Chuyển đổi blob sang base64


140

Đây là đoạn mã cho mã mà tôi muốn thực hiện Blobđể Base64xâu chuỗi:

Phần nhận xét này hoạt động và khi URL được tạo bởi phần này được đặt thành img src, nó sẽ hiển thị hình ảnh:

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

Vấn đề là với mã thấp hơn, biến nguồn được tạo là null

Cập nhật:

Có cách nào dễ dàng hơn để làm điều này với JQuery để có thể tạo Chuỗi Base64 từ tệp Blob như trong đoạn mã trên không?

Câu trả lời:


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

Hình thành các tài liệu được readAsDataURL mã hóa thành base64


1
Chuỗi đầu ra dường như không giống Base64?
quark

1
@xyenamek Nếu bạn in read.result, bạn sẽ thấy base64 trong chính chuỗi.
Nawaf Alsulami

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

9
onloadendnên đến trước readAsDataURLchỉ trong trường hợp có điều gì đó kỳ lạ xảy ra và nó kết thúc tải trước khi đến dòng mã tiếp theo. Rõ ràng điều này sẽ không bao giờ xảy ra nhưng nó vẫn là thực hành tốt.
3ocene

2
Câu trả lời này không chính xác, nó nối thêm các ký tự none-base64 vào phía trước chuỗi.
Joshua Smith

28

điều này làm việc cho tôi:

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

Đối số là cbgì?
Người lạ

1
@FellowStranger thường gọi lại, được sử dụng như blobToBase64 (myBlob, function (base64String) {/ * sử dụng base64String * /}), vì nó không đồng bộ
Leonard Pauli

@yeahdixon, Có vẻ tôi cần sự giúp đỡ của bạn. Nhìn vào đây: stackoverflow.com/questions/46192069/ từ
Người thành công

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

Thật tuyệt, @Vemonus vì FileReader hiển thị thuộc tính kết quả là base64, hoạt động hoàn hảo.
Cami Rodriguez

6

Có một cách JavaSript thuần túy không phụ thuộc vào bất kỳ ngăn xếp nào:

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

Để sử dụng chức năng trợ giúp này, bạn nên đặt một cuộc gọi lại, ví dụ:

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

Tôi viết hàm trợ giúp này cho vấn đề của mình trong dự án React Native, tôi muốn tải xuống một hình ảnh và sau đó lưu trữ nó dưới dạng hình ảnh được lưu trong bộ nhớ cache:

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

hoặc là

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

xem hàm tạo của Phản hồi , bạn có thể biến [blob, buffer source form data, readable stream, etc.]thành Phản hồi , sau đó có thể được chuyển thành [json, text, array buffer, blob]phương thức / cuộc gọi lại không đồng bộ.

chỉnh sửa: như @Ralph đã đề cập, biến mọi thứ thành chuỗi utf-8 gây ra sự cố (không may API phản hồi không cung cấp cách chuyển đổi thành chuỗi nhị phân), do đó, bộ đệm mảng được sử dụng làm trung gian thay thế, cần thêm hai bước (chuyển đổi thành mảng byte THEN thành chuỗi nhị phân), nếu bạn khăng khăng sử dụng btoaphương thức gốc .


.text () giải mã bằng UTF8, điều gì xảy ra nếu phản hồi có mã nhị phân? Tôi tin rằng điều này sẽ thất bại đối với dữ liệu phi văn bản
Ralph

Tôi thấy quan điểm của bạn, đã sửa đổi câu trả lời (mặc dù nó trở nên khá dài). Tại thời điểm này, tốt hơn là không nên nhấn mạnh vàobtoa
Valen

4

bạn có thể khắc phục sự cố bằng cách:

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

Tôi hy vọng điều này sẽ giúp bạn


4

Vì vậy, vấn đề là bạn muốn tải lên một hình ảnh cơ sở 64 và bạn có một url blob. Bây giờ câu trả lời sẽ hoạt động trên tất cả các trình duyệt html 5 là: 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);}
     });
 }

-2

Cách dễ nhất trong một dòng mã

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


18
Bởi vì câu trả lời này sử dụng API Node và do đó không trả lời câu hỏi ban đầu về Blob (API trình duyệt).
RReverser

Bộ đệm là gì?
IntoTheDeep

1
Tôi nhận được Uncaught TypeError: Đối số đầu tiên phải là một chuỗi, Buffer, ArrayBuffer, Array hoặc đối tượng giống như mảng.
Sai

@TeodorKolev nó dành riêng cho Node.js
Jader Dias
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.