将音频blob保存为rails应用程序中的文件

时间:2014-12-09 07:36:02

标签: javascript ruby-on-rails audio blob

我正在使用recorder.js并且已经成功地完成了我可以录制音频片段并一遍又一遍地回放到我心中的内容。但现在我正试图发布这个" blob" (我知道它包含正确的数据,因为它正确播放)作为我/ public文件夹中的音频wav文件。我的问题是我不知道如何处理blob并实际发布其内容。这是我的代码:

function sendWaveToPost1() {
console.log(savedWAVBlob);

$.ajax({ url: '/worm/save',
    type: 'POST',
    beforeSend: function(xhr) {xhr.setRequestHeader('X-CSRF-Token', $('meta[name="csrf-token"]').attr('content'))},
    data: 'someData=' + savedWAVBlob,
    success: function(response) {
        console.log("success");
    }
});

}

控制器:

class WormController < ApplicationController


 def create
  end

  def

 save
    audio = params[:someData]
    p audio
    save_path = Rails.root.join("public/audioFiles")

    # Open and write the file to file system.
    File.open(save_path, 'wb') do |f|
      f.write audio.read
    end

    render :text=> 'hi'
  end
end

该代码基于以下帖子:Save audio file in rails。 但是虽然我发布了一些内容,但它似乎是一个字符串而不是音频文件的实际字节。这是我收到的rails控制台错误:

NoMethodError (undefined method `read' for "[object Blob]":String):

有什么想法吗?我觉得我必须错过一些编码步骤,或者我可能只是完全误解了blob是什么。为什么我不能像这样直接发布它?

1 个答案:

答案 0 :(得分:4)

你需要将blob转换为base64url并通过ajax将其发送到数据中,以便在我正在使用的rails中上传

var reader  = new window.FileReader();
     reader.readAsDataURL(blob); 
     reader.onloadend = function() {
        var base64data = reader.result;
        var savedWAVBlob=base64data
        console.log(savedWAVBlob );
      }
    });

也在控制器

require 'base64'
save_path = Rails.root.join("public/audio")
unless File.exists?(save_path)
  Dir::mkdir(Rails.root.join("public/audio"))
end
data=params[:url]
audio_data=Base64.decode64(data['data:audio/ogg;base64,'.length .. -1])
File.open(save_path+"_audio", 'wb') do |f| f.write audio_data end
current_user.user_detail.audio=File.open(save_path+"_audio")
current_user.user_detail.audio_content_type="application/octet-stream"