我正在学习斑点,而且我注意到,当你有一个ArrayBuffer,您可以轻松地将此转换为斑点如下:如何去从斑点到ArrayBuffer
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
我现在已经是个问题,是否有可能从一个Blob到一个ArrayBuffer?
我正在学习斑点,而且我注意到,当你有一个ArrayBuffer,您可以轻松地将此转换为斑点如下:如何去从斑点到ArrayBuffer
var dataView = new DataView(arrayBuffer);
var blob = new Blob([dataView], { type: mimeString });
我现在已经是个问题,是否有可能从一个Blob到一个ArrayBuffer?
您可以使用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/
参考:
只是为了补充先生@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);
这似乎不是很多代码..对于应该很简单的东西? – 2013-05-24 17:21:44
@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
有些人真的想证明回调地狱的存在。它对于大块blob是有意义的,但对于正常使用情况,JavaScript应该提供同步方法。 – lama12345 2017-09-24 04:02:40