当前位置: 首页 > 面试题库 >

在JavaScript中从Base64字符串创建BLOB

宇文勇
2023-03-14
问题内容

我在一个字符串中有Base64编码的二进制数据:

const contentType = 'image/png';
const b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';

我想创建一个blob:包含此数据的URL并将其显示给用户:

const blob = new Blob(????, {type: contentType});
const blobUrl = URL.createObjectURL(blob);

window.location = blobUrl;

我一直无法弄清楚如何创建BLOB。

在某些情况下,我可以通过使用data:URL 来避免这种情况:

const dataUrl = `data:${contentType};base64,${b64Data}`;

window.location = dataUrl;

但是,在大多数情况下,data:URL太大了。

如何在JavaScript中将Base64字符串解码为BLOB对象?


问题答案:

atob函数会将Base64编码的字符串解码为一个新字符串,并为二进制数据的每个字节提供一个字符。

const byteCharacters = atob(b64Data);

每个字符的代码点(charCode)将是字节的值。我们可以通过使用.charCodeAt方法为字符串中的每个字符应用字节值数组。

const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
    byteNumbers[i] = byteCharacters.charCodeAt(i);
}

您可以将该字节值数组传递给Uint8Array构造函数,以将其转换为实型字节数组

const byteArray = new Uint8Array(byteNumbers);

通过将其包装在数组中并将其传递给Blob构造函数,可以依次将其转换为BLOB 。

const blob = new Blob([byteArray], {type: contentType});

上面的代码有效。但是,通过byteCharacters在较小的片中进行处理(而不是一次全部)可以稍微提高性能。在我的粗略测试中,512字节似乎是一个不错的切片大小。这为我们提供了以下功能。

const b64toBlob = (b64Data, contentType='', sliceSize=512) => {
  const byteCharacters = atob(b64Data);
  const byteArrays = [];

  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
    const slice = byteCharacters.slice(offset, offset + sliceSize);

    const byteNumbers = new Array(slice.length);
    for (let i = 0; i < slice.length; i++) {
      byteNumbers[i] = slice.charCodeAt(i);
    }

    const byteArray = new Uint8Array(byteNumbers);
    byteArrays.push(byteArray);
  }

  const blob = new Blob(byteArrays, {type: contentType});
  return blob;
}



const blob = b64toBlob(b64Data, contentType);
const blobUrl = URL.createObjectURL(blob);

window.location = blobUrl;

完整示例:

const b64toBlob = (b64Data, contentType='', sliceSize=512) => {

  const byteCharacters = atob(b64Data);

  const byteArrays = [];



  for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {

    const slice = byteCharacters.slice(offset, offset + sliceSize);



    const byteNumbers = new Array(slice.length);

    for (let i = 0; i < slice.length; i++) {

      byteNumbers[i] = slice.charCodeAt(i);

    }



    const byteArray = new Uint8Array(byteNumbers);

    byteArrays.push(byteArray);

  }



  const blob = new Blob(byteArrays, {type: contentType});

  return blob;

}



const contentType = 'image/png';

const b64Data = 'iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==';



const blob = b64toBlob(b64Data, contentType);

const blobUrl = URL.createObjectURL(blob);



const img = document.createElement('img');

img.src = blobUrl;

document.body.appendChild(img);


 类似资料:
  • 问题内容: 我在Ruby中有以下代码。我想将此代码转换为JavaScript。JS中的等效代码是什么? 问题答案: 更新: ECMAScript 6(ES6)引入了一种新型的文字,即 模板文字 。它们具有许多功能,其中包括变量插值,但对于这个问题最重要的是,它们可以是多行的。 模板文字由 反引号 分隔: (注意:我不主张在字符串中使用HTML) 浏览器支持还可以,但是您可以使用编译器来更好地兼容。

  • 问题内容: 我使用ostermillerutils库创建base64字符串,但是如果图像很重,则会出现OutOfMemory错误。如果我尝试转换的图像是简单图像,则代码工作正常。 我也尝试这样做,但是当我尝试对它进行解码时,base64是不正确的。 请为JDK 1.4和更高版本的Java建议解决方案。 问题答案: 我通过使用javabase64-1.3.1.jar库解决了我的问题。 我首先将bas

  • 问题内容: 我有一个字符串形式: 依此类推(长度会有所不同)。由此创建字典的最简单方法是什么? 我知道我可以拆分,但是我无法获得正确的语法。如果我分开,那么我如何将这两个部分结合在一起? 对此进行迭代似乎很痛苦。 问题答案: 编辑:下一个解决方案是当您想要将值作为整数,我认为这是您想要的。

  • 问题内容: 这是一个非常基本的问题。但是我无法在Java文档中找到答案,也无法对其进行测试,因为我不知道这种方法是否存在。 我可能会收到一个URL字符串,可能是 要么 然后我会得到可能以开头的资源路径,或者就像 我正在看课,可以处理第一部分,即获取hostURL使其成为HTTPS或HTTP请求。问题是附加资源路径。我必须手动检查它的第一个字母是否存在。我想知道此功能是否已经在某个类中。 问题答案:

  • 我有一个画布,我想作为图像文件上传到服务器。 我可以将画布转换为Base64字符串,但不知道如何从那里创建图像文件(因此,一旦上传到服务器,它就可以通过img src中的url直接访问)。 注意:服务器所做的只是将上传的数据保存到一个文件中,所以转换必须在客户端javascript中完成 有什么想法吗?

  • 问题内容: 从java中的json字符串创建哈希图? 我有喜欢的json字符串,想要转换为标准的Hashmap。 我该怎么做? 问题答案: 解析JSONObject并创建HashMap 测试输出: