我有一个Rails表单,文件字段指向ActiveStorage . 使用MediaRecorder API(和Safari的polyfill),我还 Build 了一个录音机 .

到目前为止一直这么好:在提交表单之前,录制的音频可以附加到 <audio> 元素并播放 . 如下所示,代码将作为blob添加到 <audio> 标记中 .

<audio controls="" data-target="audio-player.player" preload="true" src="blob:http://localhost:3000/5bb2e66f-afc0-6a46-b3f5-a95564afca55"</audio>

该表单还允许定期文件上传音频文件,该文件可以使用,并使用ActiveStorage存储,如下所定义:

has_one_attached :audio_file

现在我想提交整个表单,包括音频到Rails . 问题是由于浏览器安全性限制,无法直接设置 file_field .

所以我正在尝试一种解决方法:捕获表单 submit ,序列化它并使用 fetch 进行POST . 这也有效(表格需要 remote: true ),现在唯一缺少的是音频 .

工作回调是:

var form = self.fileFieldTarget.form;
  form.addEventListener('submit', function(e){
    e.preventDefault();
    fetch(e.target.action, {
      method: 'POST',
      body: new URLSearchParams(new FormData(e.target))
    }).then((resp) => {
      console.log(resp);
    });
  });

我看到两个选择:

1)以某种方式将编码的音频添加到表单json中,并将其视为ActiveStorage对象,然后将它们全部一起提交 . 2)在保存表单的其余部分后,单独调用以仅加载音频

如果某些HTML / JS看起来有点奇怪,我将它全部包装在StimulusJS中 . 如果需要,我很乐意分享所有的录音代码 .

enter image description here