【问题标题】:Saving an audio blob as a file in a rails app在 Rails 应用程序中将音频 Blob 保存为文件
【发布时间】:2015-02-07 00:44:30
【问题描述】:

我正在使用 recorder.js 并且已经成功地达到了可以录制音频 sn-p 并一遍又一遍地播放到我心中的内容的地步。但是现在我正在尝试将这个“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 是什么。为什么不能直接这样发呢?

【问题讨论】:

  • savedWAVBlob 不是字符串。我猜它是一个对象。所以你不能使用“+”运算符。顺便说一句,你能给出你正在使用的插件的确切 URL 吗?
  • 要发送文件数据,您需要发送多部分请求。请参阅stackoverflow.com/questions/5392344/… 在服务器端,它将作为 IO 文件数据对象传入 params,然后您可以将其保存到文件系统中。
  • @soundar 这是Recorderjs:github.com/mattdiamond/Recorderjs

标签: javascript ruby-on-rails audio blob


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-25
    • 2020-03-22
    • 2022-01-08
    • 1970-01-01
    • 2018-06-11
    • 2022-10-01
    • 1970-01-01
    • 2016-06-10
    相关资源
    最近更新 更多