Как лучше всего хранить капли в рельсах 5? - PullRequest
1 голос
/ 14 апреля 2019

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

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

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

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

Пример:

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

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

Редактировать 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\"\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 Ответ

3 голосов
/ 14 апреля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...