如何在流星中将blob插入mongodb

时间:2013-09-01 06:10:28

标签: mongodb meteor blob recorder

我正在使用Recorder.js,它允许您显示类似的录音

recorder.exportWAV(function(blob) {
  var url = URL.createObjectURL(blob);
  var au = document.createElement('audio');
  au.controls = true;
  au.src = url;
}

但是如何将blob保存到数据库?假设我有一个Recordings集合:

recorder.exportWAV(function(blob) {
  Recordings.insert({data: blob});
}

只会存储此

{data: { "type" : "audio/wav", "size" : 704556 }}

没有实际内容。

2 个答案:

答案 0 :(得分:2)

在观看来自eventedmind.com的文件上传剧集之后,事实证明这样做的方法是使用FileReader将blob读取为ArrayBuffer,然后将其转换为Uint8Array以存储在mongo中:

var BinaryFileReader = {
  read: function(file, callback){
    var reader = new FileReader;

    var fileInfo = {
      name: file.name,
      type: file.type,
      size: file.size,
      file: null
    }

    reader.onload = function(){
      fileInfo.file = new Uint8Array(reader.result);
      callback(null, fileInfo);
    }
    reader.onerror = function(){
      callback(reader.error);
    }

    reader.readAsArrayBuffer(file);
  }
}

然后是exportWAV回调

recorder.exportWAV(function(blob) {
  BinaryFileReader.read(blob, function(err, fileInfo){
    Recordings.insert(fileInfo)
  });
});

然后我可以通过以下方式显示我的录音之一:

Deps.autorun(function(){
  var rec = Recordings.findOne();
  if (rec){
    var au = document.createElement('audio');    
    au.controls = true;
    var blob = new Blob([rec.file],{type: rec.type});
    au.src = URL.createObjectURL(blob);
    document.getElementById("recordingslist").appendChild(au);
  }
})

我不知道上一个代码段是否适用于其他浏览器,但这可能是:

var base64Data = btoa(String.fromCharCode.apply(null, rec.file))
var au = document.createElement('audio');
au.controls = true;
au.src = "data:"+rec.type+";base64,"+base64Data

答案 1 :(得分:0)

以防万一,您是否注意到这一行in their example

  

确保您使用的是最近版本的Google Chrome   这一刻只适用于Google Chrome Canary。

我很快就需要为自己的项目调查一下,希望你能让它运行起来。