Javascript 在rails 5中存储blob的最佳方法是什么?

Javascript 在rails 5中存储blob的最佳方法是什么?,javascript,ruby-on-rails,ruby,ruby-on-rails-5,Javascript,Ruby On Rails,Ruby,Ruby On Rails 5,我正在创建一个录音机应用程序(rails 5)。目前,我的应用程序能够开始录制、停止录制,并将录制(.wav)保存到公共目录。我正在生成一个blob,但目前没有对它做任何处理,因为我真的不知道如何处理它 此应用程序的目的是能够录制您自己的音频,并将其保存到应用程序中的用户配置文件中,然后在以后对数据执行其他各种操作。我以前使用过carrierwave和曲别针来管理多部分数据,但我没有使用过音频文件,所以我不确定最佳做法。以下是我的一些想法: 在服务器上存储实际文件本身是不可伸缩的,因此这是不可能

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

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

  • 在服务器上存储实际文件本身是不可伸缩的,因此这是不可能的
  • 在数据库中存储blob。这可能行得通,但我不确定从blob转换回音频以及丢失的数据时是否会出现明显的低效
  • 在aws上存储blob。基本上与#2的想法相同,数据丢失,转换时效率低下
  • 在aws上存储实际文件。假设这是可能的。如果允许长的音频,可能会得到相当大的存储桶大小
  • 我真的倾向于在我的数据库(#2)中使用blob来排除第三方api的使用,如果这样做是一种好的做法的话。如果这是一个好的选择,我将如何在数据库中存储blob?我将
    bytea
    视为其他一些响应中的数据类型,但其中会存储什么?整团

    例如:

    数据:音频/wav;base64,2009年7月9日,英国GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGD7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 GGGGGGGGG7 G7 G7 G7 7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 G7 YYQTOLVAPZLCAMQI8H1SHEHGP8P5KTSBLLEXV0QODC7OTGERIFRP6CutZF6QP2AH4I9MLGQWTZKKNLBIHLGOPQGKZW4PBYZK4THMDAXUVRQTATXYOJCC2/iTY7af0IKBY0siodKsV+VFqAsOndoZJeTI1aG72UB/fo4cZnrUdwmKDROP+J661JHULTSNIKWSY4JGTE

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

    编辑:对不起,剧透没有像我期望的那样工作

    编辑2:其他一些问题。 我不确定我实际上需要提供以下
    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">
    
    看起来我在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);
          }
        };
      }
    

    如果您使用的是PostgreSQL,我建议您不要将其保存为
    bytea
    BLOB
    ,您可以在这里了解其优点

    相反,如果您选择将其保存在云提供商中,Rails 5引入了ActiveStorage,这是一个易于使用的框架,用于在多个后端上进行文件存储


    您在使用PostgreSQL吗?非常感谢。我认为ActiveStorage听起来是PoC的一个不错的选择,甚至可能是全尺寸的。你有什么可以看看我的新编辑吗?我没有遵循应该传递给ActiveStorage的attach方法的内容。我正在保存文件,但它们看起来像二进制文件,没有扩展名。你能进一步解释你的新问题吗?当使用ActiveStorage的附加方法时,
    current\u user.audio\u recordings.attach()
    ,它正在我的存储目录中创建一个文件,但它不是我所期望的.wav,而是二进制文件。我不确定我需要向
    attach
    方法的
    io
    部分传递什么,或者我只是做错了。我完全错了,它只是在存储扩展时剥离了扩展,一切都很好。谢谢!:)
    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);
          }
        };
      }