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

问题描述 投票:1回答:1

我正在创建一个录音机应用程序(rails 5)。我目前有应用程序能够开始录制,停止录制,并将录制(.wav)保存到公共目录。我正在生成一个blob,但目前我还没有做任何事情,因为我真的“不知道如何处理它”。

此应用程序的目的是能够记录您自己的音频并将其保存到应用程序中的用户配置文件中,然后再对数据执行其他各种操作。我之前使用过carrierwave和paperclip来管理多部分数据,但是我还没有使用过音频文件,所以我不确定最佳实践。以下是我的一些想法:

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

我真的倾向于在我的数据库中使用blob(#2)来排除第三方API的使用,如果这是一个很好的做法。如果这是一个不错的选择,我将如何将blob存储在数据库中?我看到bytea是来自其他几个响应的数据类型,但会存储在那里的是什么?整个blob?

例:

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

如果这不是最好的选择,你能不能告诉我哪个是最好的以及如何实现它?

编辑:对不起剧透不能像我预期的那样工作。

Edit 2: Some other questions.

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

#<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);
      }
    };
  }
javascript ruby-on-rails ruby ruby-on-rails-5
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.