当前位置: 首页 > 知识库问答 >
问题:

如何从Blob到ArrayBuffer

梁才
2023-03-14

我正在研究Blob,我注意到当你有一个ArrayBuffer时,你可以很容易地将它转换成Blob,如下所示:

var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });

我现在的问题是,有没有可能从一团变成一团?

共有3个答案

陈坚
2023-03-14

或者您可以使用fetchapi

fetch(URL.createObjectURL(myBlob)).then(res => res.arrayBuffer())

我不知道性能差异是什么,这也会显示在DevTools中的“网络”选项卡上。

盛骏祥
2023-03-14

ResponseAPI使用一个(不可变的)Blob,可以通过多种方式从中检索数据。OP只要求使用ArrayBuffer,下面是它的演示。

var blob = GetABlobSomehow();

// NOTE: you will need to wrap this up in a async block first.
/* Use the await keyword to wait for the Promise to resolve */
await new Response(blob).arrayBuffer();   //=> <ArrayBuffer>

或者你可以使用这个:

new Response(blob).arrayBuffer()
.then(/* <function> */);

注意:此API与旧(旧)浏览器不兼容,因此请查看浏览器兼容性表以确保安全;)

赫连冠玉
2023-03-14

您可以使用FileReaderBlob作为ArrayBuffer读取。

这里有一个简短的例子:

var arrayBuffer;
var fileReader = new FileReader();
fileReader.onload = function(event) {
    arrayBuffer = event.target.result;
};
fileReader.readAsArrayBuffer(blob);

下面是一个较长的示例:

// ArrayBuffer -> Blob
var uint8Array  = new Uint8Array([1, 2, 3]);
var arrayBuffer = uint8Array.buffer;
var blob        = new Blob([arrayBuffer]);

// Blob -> ArrayBuffer
var uint8ArrayNew  = null;
var arrayBufferNew = null;
var fileReader     = new FileReader();
fileReader.onload  = function(event) {
    arrayBufferNew = event.target.result;
    uint8ArrayNew  = new Uint8Array(arrayBufferNew);

    // warn if read values are not the same as the original values
    // arrayEqual from: http://stackoverflow.com/questions/3115982/how-to-check-javascript-array-equals
    function arrayEqual(a, b) { return !(a<b || b<a); };
    if (arrayBufferNew.byteLength !== arrayBuffer.byteLength) // should be 3
        console.warn("ArrayBuffer byteLength does not match");
    if (arrayEqual(uint8ArrayNew, uint8Array) !== true) // should be [1,2,3]
        console.warn("Uint8Array does not match");
};
fileReader.readAsArrayBuffer(blob);
fileReader.result; // also accessible this way once the blob has been read

这在Chrome 27-69、Firefox 20-60和Safari 6-11的控制台上进行了测试。

这里还有一个现场演示,您可以使用:https://jsfiddle.net/potatosalad/FbaM6/

更新2018-06-23:感谢Klaus Klein提供关于活动的提示。目标结果与此对比。结果

参考:

  • https://developer.mozilla.org/en-US/docs/Web/API/FileReader#readAsArrayBuffer()
  • https://www.w3.org/TR/FileAPI/#dfn-readAsArrayBuffer
 类似资料:
  • 我有一个功能应用程序,当blob被上传或更新时触发。但在我的要求中,我的容器可能一次接收数千个blob(客户将批量将blob上传到容器)。在这种情况下,正如我所知,函数app将为容器中的每个blob并行运行。但我需要在队列中处理它们。因此,我想在这里使用队列存储。每当上传blob时,让我通过blob触发功能应用程序将该blob名称作为队列消息添加到队列存储中,然后我将拥有一个队列触发功能应用,它将

  • BlobStore API(可以为GCS对象生成BlobKey,BlobStore文件API是不推荐的,但一次使用有效) Google Cloud Storage API(再次被否决,但一次使用有效) 谷歌云存储客户端库 谷歌云存储Python库 谷歌云存储JSON API库 博图 有什么理由用一个来代替另一个吗?

  • > 我正在向我的某个 Azure Api 管理 API 发送 POST 请求 在此帖子请求中,有一个 json 正文,其中包含 base64 编码的数据(zip 文件),如以下示例所示: {“foo”:“bar”,“data”:“your-base64-string”} 在API策略中,我想向Azure Storage REST API发送一个单独的请求,将上面提到的base64字符串保存为一个z

  • 我需要拍摄一个div的屏幕截图,并需要将其发送到服务器(Java)进行存储。我公司项目中的现有代码使用Html2Canvas。js获取元素的位置(div,body…)返回base64数据URI,它工作正常,但在Chrome中冻结了应用程序。因此,我正在寻找其他解决方案,并从堆栈溢出中找到以下代码。 在这里,我得到的网址是Blob-Url(blob:https://fiddle.jshell.net

  • 问题内容: 我制作了一个Java函数,将a 作为输入。我有一个实例要传递给该函数。如何将其转换为? 我是否需要使用BLOB参数重新编写函数? 问题答案: 根据“映射数据类型”文档声明类型的Java参数。然后,您调用该对象以获得。

  • 问题内容: 我允许用户通过拖放和其他方法将图像加载到页面中。放置图像时,我用来转换为对象URL以显示图像。我没有撤消该URL,因为我确实重复使用了它。 因此,当需要创建一个对象时,我可以允许他们上传其中包含其中一个图像的表单,是否可以通过某种方式将该对象URL反向转换为a ,然后可以将其附加到a 宾语? 问题答案: 正如gengkev在上面的评论中所暗示的那样,似乎最好/唯一的方法是使用异步xhr