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

Javascript 将音频blob保存为rails应用程序中的文件,javascript,ruby-on-rails,audio,blob,Javascript,Ruby On Rails,Audio,Blob,我正在使用recorder.js,我已经成功地录制了一段音频片段,并将其反复播放到我的心底。但现在我正试图将这个“blob”(我知道它包含正确的数据,因为它正在正确播放)作为音频wav文件发布到我的/public文件夹中。我的问题是,我不确定如何处理blob并实际发布其内容。这是我的代码: function sendWaveToPost1() { console.log(savedWAVBlob); $.ajax({ url: '/worm/save', type: 'POST',

我正在使用recorder.js,我已经成功地录制了一段音频片段,并将其反复播放到我的心底。但现在我正试图将这个“blob”(我知道它包含正确的数据,因为它正在正确播放)作为音频wav文件发布到我的/public文件夹中。我的问题是,我不确定如何处理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

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

您需要将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"

savedWAVBlob不是字符串。我想这是个目标。所以不能使用“+”运算符。顺便问一下,你能给出你正在使用的插件的确切URL吗?要发送文件数据,你需要发送一个多部分请求。请参见服务器端,它将在params中作为IO filedata对象传递,然后您可以将其保存到文件系统中。@soundar这是Recorderjs:
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"