2013-03-11 66 views
66

我正在学习斑点,而且我注意到,当你有一个ArrayBuffer,您可以轻松地将此转换为斑点如下:如何去从斑点到ArrayBuffer

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

我现在已经是个问题,是否有可能从一个Blob到一个ArrayBuffer?

回答

98

您可以使用FileReader来读取Blob作为ArrayBuffer

编辑:增加了短版:

var arrayBuffer; 
var fileReader = new FileReader(); 
fileReader.onload = function() { 
    arrayBuffer = this.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(progressEvent) { 
    arrayBufferNew = this.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,Firefox的20和Safari 6的控制台测试了。

这里还有一个可以玩的现场演示:http://jsfiddle.net/potatosalad/FbaM6/

参考:

+10

这似乎不是很多代码..对于应该很简单的东西? – 2013-05-24 17:21:44

+2

@HenleyChiu我编辑了答案以包含简短版本的代码。较长的示例旨在完全自包含(显示如何创建ArrayBuffer,Blob,然后再返回)。我一直无法找到一种不使用[Web Worker](http://dev.w3.org/html5/workers/)和[FileReaderSync](https://developer.mozilla)来读取Blob的同步方式.ORG/EN-US /文档/网络/ API/FileReaderSync)。 – potatosalad 2013-05-25 15:42:56

+0

有些人真的想证明回调地狱的存在。它对于大块blob是有意义的,但对于正常使用情况,JavaScript应该提供同步方法。 – lama12345 2017-09-24 04:02:40

4

只是为了补充先生@potatosalad答案。

你实际上并不需要访问功能范围就要上的onload回调的结果,你可以自由地做在事件参数如下:

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

为什么这个更好?因为那么我们可以使用箭头功能而不会丢失上下文

var fileReader = new FileReader(); 
fileReader.onload = (event) => { 
    this.externalScopeVariable = event.target.result; 
}; 
fileReader.readAsArrayBuffer(blob);