将音频文件保存在 Rails 中
Posted
技术标签:
【中文标题】将音频文件保存在 Rails 中【英文标题】:Save audio file in rails 【发布时间】:2013-09-14 11:30:26 【问题描述】:我有一个简单的 Rails 应用程序,我在其中使用 html5 音频 Web api 和 recorder.js 来录制语音,然后将其保存在应用程序服务器上。录音正常,我可以重播录音并听到声音,但是当我将其发布到服务器上时,我的音频文件是空白的。
html/js 代码
function stopRecording()
recorder.stop();
recorder.exportWAV(function(s)
audio.src = window.URL.createObjectURL(s);
sendWaveToPost(s);
);
function sendWaveToPost1(blob)
alert('in');
var data = new FormData();
data.append("audio", blob, (new Date()).getTime() + ".wav");
var oReq = new XMLHttpRequest();
oReq.open("POST", "/audio/save_file");
oReq.send(data);
oReq.onload = function(oEvent)
if (oReq.status == 200)
console.log("Uploaded");
else
console.log("Error " + oReq.status + " occurred uploading your file.");
;
控制器代码
def save_file
audio = params[:audio]
save_path = Rails.root.join("public/#audio.original_filename")
# Open and write the file to file system.
File.open(save_path, 'wb') do |f|
f.write params[:audio].read
end
render :text=> 'hi'
end
控制台日志
Parameters: "audio"=>#<ActionDispatch::Http::UploadedFile:0xb61fea30
@original_filename="1379157692066.wav", @content_type="audio/wav", @headers="Content-
Disposition: form-data; name=\"audio\"; filename=\"1379157692066.wav\"\r\nContent-Type:
audio/wav\r\n", @tempfile=#<File:/tmp/RackMultipart20130914-3587-tgwevx>>
【问题讨论】:
你可以在File.open
之前使用pry或其他调试器停止执行,使用params[:audio].tmpfile
检查临时文件路径并检查该文件是否为空? (只是想将问题一分为二,以了解它是发生在客户端还是服务器端)
tmpfile 不存在,我打印了 output params[:audio].tempfile n 它给出了类似 #<0x93280e4>0x93280e4>
【参考方案1】:
好的,我知道了。
问题是当文件进入时,它会将读取光标设置为文件末尾 所以我们需要先回退文件以确保读取光标设置在开头。
将我的控制器代码更改为以下代码,它可以工作。
audio.rewind
# Open and write the file to file system.
File.open(save_path, 'wb') do |f|
f.write audio.read
end
【讨论】:
【参考方案2】:试试:
File.open(save_path, 'wb:binary') do |f|
【讨论】:
以上是关于将音频文件保存在 Rails 中的主要内容,如果未能解决你的问题,请参考以下文章
将录制的音频保存在文档目录中并创建一个包含所有音频文件的数据库