将 blob 转换为 base64

IT技术 javascript jquery
2021-01-24 04:15:26

这是我想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);

问题出在较低的代码上,生成的源变量为空

更新:

是否有一种更简单的方法可以使用 JQuery 来从 Blob 文件创建 Base64 字符串,如上面的代码所示?

6个回答
var reader = new FileReader();
reader.readAsDataURL(blob); 
reader.onloadend = function() {
  var base64data = reader.result;                
  console.log(base64data);
}

文档 readAsDataURL编码为 base64

作为一个有await能力的功能:

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

注意:如果不先删除 Base64 编码数据之前的 Data-URL 声明,则无法将 blob 的结果直接解码为 Base64。要仅检索 Base64 编码的字符串,请首先从结果中删除数据:/ ;base64。

console.log(base64data.substr(base64data.indexOf(',')+1));
2021-03-24 04:15:26
@xybrek 如果您打印 read.result,您将在字符串本身中看到 base64。
2021-04-01 04:15:26
onloadend应该readAsDataURL放在之前以防万一发生奇怪的事情并且它在到达下一行代码之前完成加载。显然这永远不会发生,但它仍然是一个很好的做法。
2021-04-03 04:15:26
这个答案是不正确的,它将非 base64 字符附加到字符串的前面。
2021-04-05 04:15:26
输出字符串看起来不像 base64?
2021-04-06 04:15:26

这对我有用:

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);
};
@FellowStranger 常用回调,像 blobToBase64(myBlob, function(base64String) {/*use the base64String*/}) 一样使用,因为它是异步的
2021-03-11 04:15:26
论据是什么cb
2021-03-18 04:15:26
回调是一个传递的函数,它在完成时触发
2021-03-23 04:15:26
@yeahdixon,看来我需要你的帮助。看看这个:stackoverflow.com/questions/46192069/...
2021-03-26 04:15:26
你如何等待执行?我总是未定义
2021-04-08 04:15:26

有一种不依赖于任何堆栈的纯 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);
  });
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 公开到结果属性中,工作完美。
2021-03-29 04:15:26
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 没有提供转换为二进制字符串的方法),因此使用数组缓冲区作为中间值,这需要另外两个步骤(将其转换为字节数组 THEN 到二进制字符串),如果你坚持使用本机btoa方法。

我明白你的意思,修改了答案(虽然它变得很长)。这个时候最好不要坚持btoa
2021-03-26 04:15:26
.text() 使用 UTF8 解码,如果响应具有二进制代码会发生什么?我相信这对于非文本数据会失败
2021-04-02 04:15:26