将Blob转换为base64


140

这是我要BlobBase64字符串进行编码的代码片段:

该带注释的部分有效,当由此生成的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);

问题在于下面的代码,生成的源变量为null

更新:

有没有更简单的方法可以使用JQuery做到这一点,从而能够从Blob文件创建Base64字符串,如上面的代码?

Answers:


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

文档 readAsDataURL编码为base64


1
输出的String看起来不像base64?
夸克

1
@xybrek如果打印read.result,您将在字符串本身中看到base64。
Nawaf Alsulami 2014年

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

9
onloadend应该先readAsDataURL出现,以防万一发生奇怪的事情,并在到达下一行代码之前完成加载。显然,这永远不会发生,但这仍然是一种好习惯。
3ocene 2015年

2
这个答案是错误的,它在字符串的前面附加了none-base64字符。
约书亚·史密斯

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,function(base64String){/ *使用base64String * /})一样使用,因为它是异步的
Leonard Pauli

@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公开给result属性为base64。
卡米·罗德里格斯

6

有一种不依赖任何堆栈的纯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字符串会引起问题(不幸的是,Response API没有提供将其转换为二进制字符串的方式),因此将数组缓冲区用作中间变量,这需要两个步骤(将其转换为字节数组,然后将其转换为二进制字符串)(如果您坚持使用本机btoa方法)。


.text()使用UTF8解码,如果响应具有二进制代码,会发生什么?我认为这将对非文本数据失败
拉尔夫

我明白你的意思,修改了答案(尽管变得很冗长)。此时最好不要坚持btoa
Valen

4

您可以通过以下方法解决问题:

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

希望对您有帮助


4

因此,问题在于您要上传基本64位图像,并且具有Blob网址。现在,适用于所有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);}
     });
 }

-2

一行代码中最简单的方法

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


18
由于此答案使用Node API,因此无法回答有关Blob(浏览器API)的原始问题。
RReverser

什么是缓冲液?
IntoTheDeep

1
我收到Uncaught TypeError:第一个参数必须是字符串,Buffer,ArrayBuffer,Array或类似数组的对象。
错误

@TeodorKolev它特定于Node.js
Jader Dias
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.