Каков наилучший способ хранения больших двоичных объектов в rails 5?

#javascript #ruby-on-rails #ruby #ruby-on-rails-5

#javascript #ruby-on-rails #ruby #ruby-on-rails-5

Вопрос:

Я создаю приложение для записи звука (rails 5). В настоящее время у меня есть приложение, способное запускать запись, останавливать запись и сохранять запись (.wav) в общедоступном каталоге. Я создаю большой двоичный объект, но в настоящее время ничего с ним не делаю, поскольку я действительно «не знаю, что с ним делать».

Цель этого приложения — иметь возможность записывать свой собственный звук и сохранять его в своем профиле пользователя в приложении, а затем выполнять другие различные действия с данными позже. Раньше я использовал carrierwave и paperclip для управления составными данными, но я не работал с аудиофайлами, поэтому я не уверен в лучших методах. Вот некоторые из моих мыслей:

  1. Хранение фактических файлов на самом сервере не масштабируется, так что об этом не может быть и речи.
  2. Хранение больших двоичных объектов в базе данных. Это может сработать, но я не уверен, будет ли заметная неэффективность при обратном преобразовании в аудио из большого двоичного объекта, а также при потере данных.
  3. Хранение больших двоичных объектов в aws. В основном те же мысли, что и # 2 с потерей данных и неэффективностью при преобразовании.
  4. Хранение реальных файлов в aws. Предполагая, что это возможно. Размер корзины может быть довольно большим, если разрешить длинный звук.

Я действительно склоняюсь к использованию больших двоичных объектов в моей базе данных (# 2), чтобы исключить использование сторонних API, если это хорошая практика. Если это хороший вариант, как мне сохранить большой двоичный объект в базе данных? Я вижу bytea тип данных из нескольких других ответов, но что там будет сохранено? Весь большой двоичный объект?

Пример:

data:audio/wav;base64,GkXfo59ChoEBQveBAULygQRC84EIQoKEd2VibUKHgQRChYECGFOAZwH/////////FUmpZpkq17GDD0JATYCGQ2hyb21lV0GGQ2hyb21lFlSua7 uvdeBAXPFh16n8rxO9UKDgQKGhkFfT1BVU2Oik09wdXNIZWFkAQEAAIC7AAAAAADhjbWERzuAAJ BAWJkgSAfQ7Z1Af/////////ngQCjQYiBAACA 4MC0f/ 3/abXFmCecYAQzBpCOhi/o3VWPm9t4OomPezg0lN7vXJNZDU1/lsNMC5P/PIA 0cQh0Ye5IyXuGV4/IEeblfjEYYqTOlvApzLcAMqI8H1sRhHEHGp8p5KtsBLleXV0qODc7OtgErifrP6CuTzF6qP2AH4i9MlGQwtzxKNLBIHlgOpQgkzw4pByZXK4thmdAXUvRQtAtxYoJcC2/iTY7af0IKBY0siodKsV VFqAsOndoZJeTI1aG72UB/fo4cZnrUdwmKDROP J661jhULtSnIKKWsy4jGTE…..

Если это не лучший вариант, не могли бы вы сообщить мне, какой из них будет лучшим и как его достичь?

Редактировать: Извините, спойлеры работают не так, как я ожидал.

Редактировать 2: некоторые другие вопросы.

Я не уверен, что мне действительно нужно предоставить следующий 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"rnContent-Type: audio/wavrn">
 

Я перепробовал много разных вариантов этого, но получаю файлы, сохраненные в моем каталоге хранения, как безумно выглядящие файлы.

 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. Используете ли вы PostgreSQL?

Ответ №1:

Если вы используете PostgreSQL, я бы не советовал сохранять его как bytea и как BLOB , вы можете прочитать о преимуществах здесь.

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

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

Вместо этого, если вы пойдете по пути сохранения его в своем облачном провайдере, в Rails 5 появился ActiveStorage, который представляет собой простой в использовании фреймворк для хранения файлов на нескольких бэкэндах.

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

Комментарии:

1. Большое вам спасибо. Я думаю, что ActiveStorage звучит как хороший выбор для PoC и, возможно, даже для полномасштабного использования.

2. в любом случае, вы можете взглянуть на мои новые изменения? Я не понимаю, что я должен передавать в метод attach для ActiveStorage. Я сохраняю файлы, но они выглядят как двоичные файлы и не имеют расширений.

3. Можете ли вы подробнее объяснить свой новый вопрос?

4. При использовании метода attach current_user.audio_recordings.attach() ActiveStorage он создает файл внутри моего каталога хранения, но это не файл .wav, как я ожидал, это двоичный файл. Я не уверен, что мне нужно передать в ту io часть attach метода, или я просто делаю это неправильно.

5. Я был совершенно неправ, он просто удаляет расширение, когда оно сохраняется, все хорошо. Спасибо! 🙂