Javascript 将blob作为Uint8Array发送到NodeJS并将其保存到文件

Javascript 将blob作为Uint8Array发送到NodeJS并将其保存到文件,javascript,node.js,blob,html5-filesystem,web-mediarecorder,Javascript,Node.js,Blob,Html5 Filesystem,Web Mediarecorder,我正在尝试将来自Firefox中新MediaRecorder API的blob发送到NodeJS,以将其存储在文件中。blob包含转换为webm文件的录制。 在发送之前,我将这个blob分块成一定大小,以便能够通过webrtc数据通道提供的带宽发送它。这个看起来像这样: var blobToBuffer = function(blob, cb) { var reader = new FileReader(); reader.onload = function() { cb(rea

我正在尝试将来自Firefox中新MediaRecorder API的blob发送到NodeJS,以将其存储在文件中。blob包含转换为webm文件的录制。 在发送之前,我将这个blob分块成一定大小,以便能够通过webrtc数据通道提供的带宽发送它。这个看起来像这样:

var blobToBuffer = function(blob, cb) {
  var reader = new FileReader();
  reader.onload = function() {
    cb(reader.result);
  };
  reader.readAsArrayBuffer(blob);
};

blobToBuffer(blob, function(buffer){
  var sendInterval = setInterval(function(){
    var currentEnd = dataSend + dis._dataChunkSize;
    if(currentEnd > buffer.byteLength){
      currentEnd = buffer.byteLength;
    } 
    var part = Array.apply([], new Uint8Array(buffer.slice(dataSend, currentEnd)));
    dis.dataChannel.send(
      JSON.stringify({
        payload: part
      })
    );
    dataSend = currentEnd;
    if(dataSend + 1 >= buffer.byteLength){
      dis.dataChannel.send(JSON.stringify({action: 'dataEnd'}));
      clearInterval(sendInterval);
    }
  }, 1000);
});
在nodeJS方面,我尝试将数据转换回webm文件,如下所示:

fs.appendFile('my/path/file.webm', new Buffer(new Uint8Array(message.payload)), function(error){
    if(error){
        console.log(error);
    } else {
        console.log('Chunk successfully written');
    }
});
它告诉我,区块已写入,但文件为空。我用从blob派生的base64编码字符串尝试了同样的方法,这是可行的,但由于可能的数据损坏,这似乎是个坏主意

我错过了什么?还是有更好的方法将blob从JavaScript传输到NodeJS

编辑

uint8array构造函数似乎不接受以字符串形式输入的数据:

'0':39,'1':209,'2':79,'3':0,'4':230,'5':133,
‘6’:190、‘7’:138、‘8’:188、‘9’:103、‘10’:131、

在新的Uint8Array(message.payload)部分之后,数组长度仍然是0。那么,应该怎么做呢

编辑II

在使用JSON.stringify()时添加了.toString()之后,我按照希望的方式接收了UInt8Array。但是,正如上面显示的代码,它只将[object uint8array]写入文件

编辑III-解决方案


使用上面的代码可以很好地工作。

uint8array上使用
toString
时应该得到的。只需将缓冲区转换为字符串并发送字符串。如果您愿意,您可以尝试base64编码,但我认为您不应该需要它

var str = ""; // string version of the part
for{var i = 0; i < part.length; i++){
    str += String.fromCharCode( part[i] );
}
dis.dataChannel.send(
  JSON.stringify({
    payload: str
  })
);

还要确保mime类型正确。

非常感谢。实际上我让它工作了(见上文)。使用toString()是一个幼稚的问题。我想知道哪一个性能更好。对于所有感兴趣的人:我在JSPerf上创建了一个测试查看浏览器控制台以获取说明。要点:使用ArrayBuffer并在NodeJ上处理它
dis.dataChannel.send(
  JSON.stringify({
    payload: btoa(str)   // encode string as base64;
  })
);