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