在轨道5中存储斑点的最佳方法是什么?

时间:2019-04-14 13:57:10

标签: javascript ruby-on-rails ruby ruby-on-rails-5

我正在创建一个录音机应用程序(第5条)。我目前拥有可以开始记录,停止记录并将记录(.wav)保存到公共目录的应用程序。我正在生成一个Blob,但目前并未对其进行任何处理,因为我并不真正地“知道如何处理它”。

此应用程序的目的是能够录制您自己的音频并将其保存到应用程序内的用户配置文件中,然后在以后对数据进行其他各种处理。之前,我已经使用了载波和回形针来管理多部分数据,但是我没有使用音频文件,因此我不确定最佳实践。这是我的一些想法:

  1. 在服务器本身上存储实际文件是不可扩展的,因此这是不可能的。
  2. 在数据库中存储Blob。这可能有效,但是我不确定从blob转换回音频以及丢失数据时是否会出现明显的效率低下。
  3. 将斑点存储在aws上。基本上与#2想法相同,但数据丢失并且转换时效率低下。
  4. 将实际文件存储在AWS上。假设这是可能的。如果允许长音频,则存储桶大小可能会变得相当大。

如果这样做是一种好习惯,那么我真的倾向于在数据库(#2)中使用blob来排除使用第三方API。如果这是一个不错的选择,我将如何在数据库中存储Blob?我从其他一些响应中看到bytea是数据类型,但是那里存储了什么?整个斑点?

示例:

  

数据:音频/ WAV; BASE64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQRChYECGFOAZwH ///////// FUmpZpkq17GDD0JATYCGQ2hyb21lV0GGQ2hyb21lFlSua7 + uvdeBAXPFh16n8rxO9UKDgQKGhkFfT1BVU2Oik09wdXNIZWFkAQEAAIC7AAAAAADhjbWERzuAAJ + BAWJkgSAfQ7Z1Af ///////// ngQCjQYiBAACA + 4MC0f / + 3 / abXFmCecYAQzBpCOhi / o3VWPm9t4OomPezg0lN7vXJNZDU1 / lsNMC5P / PIA + 0cQh0Ye5IyXuGV4 / IEeblfjEYYqTOlvApzLcAMqI8H1sRhHEHGp8p5KtsBLleXV0qODc7OtgErifrP6CuTzF6qP2AH4i9MlGQwtzxKNLBIHlgOpQgkzw4pByZXK4thmdAXUvRQtAtxYoJcC2 / iTY7af0IKBY0siodKsV + VFqAsOndoZJeTI1aG72UB / fo4cZnrUdwmKDROP + J661jhULtSnIKKWsy4jGTE .....

如果这不是最好的选择,您能否让我知道最好的是哪种以及如何实现呢?

编辑:抱歉,扰流板无法正常工作。

编辑2:其他一些问题。

我不确定在https://edgeguides.rubyonrails.org/active_storage_overview.html之后提供attach方法的实际需求。现在,我将音频作为文件传递到控制器:

#<ActionDispatch::Http::UploadedFile:0x007ff58958a788 @tempfile=#<Tempfile:/var/folders/xb/zm03wqls70gf3thlfy0d67bh0000gn/T/RackMultipart20190414-15311-1essuud.wav>, @original_filename="1555288144507.wav", @content_type="audio/wav", @headers="Content-Disposition: form-data; name=\"audio\"; filename=\"1555288144507.wav\"\r\nContent-Type: audio/wav\r\n">

我尝试了很多不同的方法,但是正在将文件保存为疯狂的文件保存在存储目录中。

current_user.audio_recordings.attach(
  io: audio, 
  filename: 'file.wav', 
  content_type: 'audio/wav'
)

似乎我在JS中的工作量可能比我需要做的要重得多。

JS保存功能:

function saveRecording() {
    var data = new FormData();

    data.append("audio", recordingBlob, (new Date()).getTime() + ".wav");

    var request = new XMLHttpRequest();
    request.open("POST", "/landing_pages/save_audio");
    request.send(data);
    request.onload = function(oEvent) {
      if (request.status == 200) {
        console.log("Uploaded");
      } else {
        console.log("Error: " + request.status);
      }
    };
  }

1 个答案:

答案 0 :(得分:3)

如果您使用的是PostgreSQL,我建议您不要将其另存为byteaBLOB,您可以在此处阅读有关好处。

https://wiki.postgresql.org/wiki/BinaryFilesInDB#bytea

https://github.com/diogob/carrierwave-postgresql

如果您不打算将其保存到云提供商中,Rails 5会引入ActiveStorage,这是一个易于使用的框架,用于在多个后端存储文件。

https://edgeguides.rubyonrails.org/active_storage_overview.html