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

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

尹欣怿
2023-03-14

我试图从Firefox中的新MediaRecorderAPI发送一个Blob到NodeJS以将其存储在文件中。Blob包含转换为webm-file的记录。我在发送之前将这个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派生的bas64编码字符串,这是可行的,但似乎是一个坏主意,因为可能的数据损坏。

我错过了什么?还是有更好的方法将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时使用toString()。stringify()我成功地接收到了UInt8Array。但是,正如上面显示的代码,它只将[object uint8array]写入文件。

EDIT III-解决方案

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

共有1个答案

章彬郁
2023-03-14

当您在uint8ray上使用toString时,您应该得到[对象uint8ray]。只需将缓冲区转换为字符串并发送字符串。如果你愿意,你可以尝试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
  })
);

如果Nodejs不喜欢字符串原样,则使用btoa将其转换为base64编码。不要担心不会损坏,这就是base64阻止某些传输协议误解原始二进制字符串的原因。

dis.dataChannel.send(
  JSON.stringify({
    payload: btoa(str)   // encode string as base64;
  })
);

还要确保mime类型是正确的。

 类似资料:
  • 问题内容: 我想通过AJAX将字段数据从表单发送到文件,并且在网上找到了此解决方案:http : //techglimpse.com/pass-localstorage- data-php-ajax-jquery/ 唯一的问题是,我有多个字段而不是单个字段,并且我想将输出(localStorage)保存为HTML(或任何其他格式)文件,而不是将其显示在#output div中。 我怎样才能做到这一

  • 我将pdf文档存储在服务器端的文件系统中。 我需要让用户下载其中一个,当他/她点击下载。 问题是我知道如何将文件从NodeJS发送到浏览器,但这里的请求将由ReactJS axios请求发出。因此,当我发送文件时,响应将转到react。如何将该pdf文件发送给用户?我是否使用前端代码直接访问文件系统? 在NodeJS中执行之后,当我记录响应时,我在浏览器控制台中获得以下信息 我如何处理这个问题,以

  • 我最近在学习如何阅读

  • 我将一个DBF文件输入到数据框中并运行查询。 这是密码。 然后得到这样一个错误。。KeyError:[Int64Index([0],dtype='int64')]中没有一个在[columns]中 这是我想要的文本文件的输出..."2020-01-01 943 527.0 56.46 56.46 0.0 0.0"

  • 问题内容: 编辑:整个问题原来是网络问题,但是如果您看到有关如何优化流程的任何想法,我仍然会感激不尽。 我对Servlets还是很陌生,在不久的将来,我遇到了一个与性能有关的问题。我正在尝试通过Google Chrome浏览器中的XHR对象发送视频文件。视频文件存储在Blob对象中。我在JavaScript脚本中使用了此功能: 它运行良好,因为Blob到达Servlet,在这里我使用以下代码对其进

  • 我需要将大型csv文件从node发送到Python。这段代码适用于小文件,但不适用于大文件。我也试过产卵过程。我不明白问题出在哪里。如果有人知道正确的代码,请分享 代码: 错误