在JavaScript中通过Base64字符串创建一个BLOB

12 浏览
0 Comments

在JavaScript中通过Base64字符串创建一个BLOB

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

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

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

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

\n我一直没有弄清如何创建BLOB对象。\n在某些情况下,我可以通过使用data: URL来避免这个问题:\n

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

\n但是,在大多数情况下,data: URL太大而无法使用。\n


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

0
0 Comments

在JavaScript中从Base64字符串创建BLOB的原因是为了优化性能和处理大型数据。通过将字节切片成多个BLOB,可以将大型数据分成小块进行处理,减少内存占用和避免内存溢出问题。

这段代码中的优化实现使用了切片大小(sliceSize)为1024。它首先将Base64字符串解码为字节数组,然后根据切片大小将字节数组切片成多个小块。每个小块都被转换为Uint8Array类型的数组,并存储在byteArrays数组中。最后,使用这些小块数组创建一个BLOB对象,并指定内容类型。

为什么要进行切片操作?这是因为在处理大型数据时,将数据分成小块可以提高性能和减少内存占用。特别是在Android设备上,如果不进行切片操作,可能会遇到内存溢出的问题。

这段代码的优化实现被称为“优化”,因为它通过重新组织循环条件检查和本地变量来提高性能。它避免了多次访问数组和字符串的开销,从而提高了执行速度。

然而,有一些评论者表示,在实际测试中,这个优化实现的性能并不比原始实现好。他们提到在IE11和Chrome上测试时,这个优化实现的性能下降了50%到100%。可能是因为对于不同的工作负载和切片大小,性能表现存在差异。

从Base64字符串创建BLOB的原因是为了优化性能和处理大型数据。通过将数据切片成小块,可以提高性能并避免内存溢出问题。这段优化实现的性能在不同的浏览器和工作负载下可能有所不同,需要进行实际测试和性能优化。

0
0 Comments

从上面的内容可以整理出以下问题的出现原因和解决方法:

问题:如何在JavaScript中从Base64字符串创建一个BLOB?

原因:Base64字符串是一种常见的数据格式,但是在JavaScript中直接将它转换为BLOB并不直观。因此,需要找到一种方法来解决这个问题。

解决方法:可以使用fetch API来创建一个BLOB。具体步骤如下:

1. 通过fetch函数获取Base64字符串对应的数据。

2. 使用.then方法将相应的数据转换为BLOB对象。

3. 使用console.log方法打印BLOB对象。

另外,也可以将上述步骤封装成一个函数b64toBlob,方便复用。该函数接受两个参数,一个是Base64字符串,另一个是BLOB的MIME类型,默认为'application/octet-stream'。

此外,文章还提到了不推荐使用Base64字符串的原因,以及一些替代方案。比如,可以使用canvas.toBlob方法代替canvas.toDataURL方法来获取BLOB对象,使用FormData对象来发送二进制文件等。

通过使用fetch API和一些额外的处理步骤,可以在JavaScript中从Base64字符串创建一个BLOB对象。同时,文章也提到了不推荐使用Base64字符串的原因,并提供了一些替代方案。

0
0 Comments

在JavaScript中,将Base64字符串转换为BLOB的过程中可能会遇到一些问题。下面是一个解决方法:

问题的原因是在处理大型文件时,代码会导致浏览器崩溃或卡顿。在IE浏览器中,以下代码会引发内存异常:var byteNumbers = new Array(slice.length)。在Chrome浏览器中,for循环会导致相同的问题。

解决方法是将处理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 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);

这段代码将Base64字符串转换为BLOB,并将其显示为图像。你可以根据需要更改contentType和b64Data。

这种方法可以解决在处理大型文件时导致浏览器崩溃或卡顿的问题。但是,一些用户报告说,在处理视频文件时仍然存在问题。这可能是因为视频文件的处理方式与图像文件不同。

另外,一些用户表示atob函数已经过时,建议使用Buffer.from(data ,'base64')代替。另外,使用charCodeAt处理缓冲区可能无法正常工作。

希望这些解决方法能对你有所帮助!

0