Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在rails中保存音频文件_Javascript_Ruby On Rails_Html_Audio - Fatal编程技术网

Javascript 在rails中保存音频文件

Javascript 在rails中保存音频文件,javascript,ruby-on-rails,html,audio,Javascript,Ruby On Rails,Html,Audio,我有一个简单的rails应用程序,我使用HTML5音频web api和recorder.js录制语音,然后将其保存在应用服务器上。录音进行得很好,我可以重放录音并听到声音,但当我在服务器上发布时,我的音频文件是空白的 html/js代码 function stopRecording() { recorder.stop(); recorder.exportWAV(function(s) { audio.src = wi

我有一个简单的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>>}
参数:{“audio”=>
试试:


好的,我知道答案了

问题是当文件进入时,它将把读取光标设置到文件的末尾 因此,我们需要首先倒带文件,以确保读取光标设置为开头

将我的控制器代码更改为下面的代码,它就工作了

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

您是否可以在
文件之前使用pry或其他调试器停止执行。打开
,使用
参数[:audio].tmpfile检查临时文件路径,并检查该文件是否为空?(只是想把问题一分为二,看看它是发生在客户端还是服务器端)tmpfile不存在,我打印了输出参数[:audio].tempfile n,它给出了如下内容#
      audio.rewind
        # Open and write the file to file system.
      File.open(save_path, 'wb') do |f|
        f.write audio.read
      end