Я создаю приложение для записи звука (rails 5).В настоящее время у меня есть приложение, которое может начать запись, остановить запись и сохранить запись (.wav) в общедоступный каталог.Я генерирую большой двоичный объект, но в настоящее время я ничего с ним не делаю, так как я действительно «не знаю, что с ним делать».
Цель этого приложения - записать собственное аудио исохраните его в своем профиле пользователя в приложении, а затем выполните другие различные действия с данными позже.Раньше я использовал carrierwave и paperclip для управления многокомпонентными данными, но я не работал с аудиофайлами, поэтому я не уверен в лучших практиках.Вот некоторые из моих мыслей:
- Хранение реальных файлов на самом сервере не масштабируется, поэтому об этом не может быть и речи.
- Хранение больших двоичных объектов в базе данных.Это может сработать, но я не уверен, будет ли заметная неэффективность при конвертации обратно в аудио из BLOB-объектов, а также в потерянные данные.
- Хранение BLOB-объектов в AWS.В основном те же мысли, что и у # 2 с потерянными данными и неэффективностью при конвертации.
- Хранение актуальных файлов в 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);
}
};
}