Диапазон звукового содержимого Rails ActiveStorage

Это началось как простое использование ActiveStorage, просто сохраните некоторые аудиофайлы в формате mp3 (сделано легко) и отобразите их на сайте:

<%= audio_tag url_for(recording.audio_file), controls: true, preload: "none" %>

Я тестировал в Chrome и Firefox, и он работает, я могу без проблем воспроизводить звук столько раз, сколько захочу, но когда я тестировал его в Safari, я столкнулся с проблемой, что Safari предполагает, что сервер поддерживает Content-Range, поэтому Safari думает, что это является прямой трансляцией, и элемент html5 может воспроизводиться только один раз.

Итак, я искал в Интернете, как это исправить, и я видел ответы, указывающие на:

  • Веб-сервер не поддерживает его, но я использую Apache 2.4, а начиная с 2.2 он по умолчанию поддерживает Content-Range.
  • Safari — ерунда, которая мне не помогает
  • Вы должны реализовать это на Rails, да, это может быть решением, но я проверил код для ActiveStorage (https://github.com/rails/rails/blob/master/activestorage/lib/active_storage/service/disk_service.rb#L41), но мне пришлось бы его изменить (я нашел этот ответ поток медиафайлов rails принимает запрос диапазона байтов с помощью метода send_data или send_file), что кажется полезным, но может показаться, что это должно быть проще и не должно требовать от меня изменить реализацию ActiveStorage.
  • Итак, последняя возможность заключается в том, что я не понимаю концепцию того, как все сплетено вместе, и ответ, вероятно, прост и легко реализуем, поэтому в Интернете нет информации, потому что это очевидно, но я не могу понять это из.

Кто-нибудь может подсказать, как использовать ActiveStorage для хранения и передачи звука, который можно представить с помощью аудиотега html5, который работает в Chrome, FireFox и Safari.

Спасибо за вашу помощь.


person Derik Ramirez    schedule 19.06.2018    source источник
comment
Кажется, что сервер действительно обработает запрос, если мы настроим Rails на отправку пути к файлу. В настоящее время Rails отправляет файл в виде необработанных данных (см.: github.com/rails/rails/blob/v5.2.0/activestorage/app/ для Rails5.2.0). Если бы мы хотели, чтобы Rails передал управление серверу, мы должны вместо использования send_data использовать send_file, и это было исправлено в основной ветке rails, см.:(github.com/rails/rails/blob/master/activestorage/app/), так что это вопрос просто жду.   -  person Derik Ramirez    schedule 19.06.2018
comment
Мы будем следить за обсуждением github для ActiveStorage: github.com/rails/rails/issues/32193 мы видим, что фиксация не решает проблему. Все еще работаю над этим. Если у кого-то есть еще мысли, дайте мне знать, если я найду что-то новое, я опубликую здесь, чтобы помочь всем, кто находится на той же лодке. На данный момент одно из предлагаемых решений заключается в использовании: file_status, file_headers, file_body = Rack::File.new(nil).serving(request, path) response.status = file_status response.headers.merge!(file_headers) self.response_body = file_body   -  person Derik Ramirez    schedule 21.06.2018