Rails + X-Sendfile, обслуживающий большое видео на Ipad

У меня есть приложение, в котором хранятся большие (несколько сотен МБ) видеофайлов, и он отлично работает на настольных браузерах, используя Rails + X-Sendfile на Apache. Важным требованием является то, что эти видео должны быть частными и видимыми только для зарегистрированных пользователей, поэтому я использую Rails для их обслуживания.

Все отлично работает с другими устройствами. Я обслуживаю видео таким образом:

response.headers["X-Sendfile"]=  filename
send_file filename, :disposition => :inline, :stream => true, :x_sendfile => true

Но для запросов Ipad нужен заголовок диапазона байтов. Решение (которое работает не так) выглядит примерно так:

size = File.size(filename)
bytes = Rack::Utils.byte_ranges(request.headers, size)[0]
offset = bytes.begin
length = bytes.end  - bytes.begin

response.header["Accept-Ranges"]=  "bytes"
response.header["Content-Range"] = "bytes #{bytes.begin}-#{bytes.end}/#{size}"

send_data IO.binread(filename,length, offset), :type => "video/mp4", :stream => true, :disposition => 'inline', :file_name => filename 

С этим решением у меня проблемы с видеороликами размером более 50 МБ, и, что более важно, я даю рельсам ответственность, которой он не должен обладать. Это должен быть apache для обработки большой нагрузки потоковой передачи через модуль x-sendfile. Но я не знаю, как это сделать. метод send_data не имеет параметра x-sendfile, а решения, связанные с методом send_file, не работают.

Я нашел эти два вопроса похожими на мои, но они не работают: поток медиа файлов rails принимает запрос диапазона байтов через метод send_data или send_file, Каким образом можно обслуживать файлы mp4 через рельсы на Ipad?

Есть ли какая-нибудь подсказка о том, что происходит? Я борюсь с этим с недель, и мне нужно заставить его работать. Другие приемлемые решения приветствуются.

Ответы

Ответ 1

Это может быть совершенно не связано, поскольку я использую nginx для сервера, но если он не работает только для ios, посмотрите это сообщение в блоге. Для Apache может быть аналогичное решение.

В некотором смысле, мне пришлось добавить заголовок прокси, который внутренне перенаправляет путь к папке. Как бы глупо это ни казалось, у Apple есть какие-то проблемы с конфиденциальностью, которые делают это необходимым для воспроизведения аудио- и видеофайлами. Опять же не уверен, что это решение для вас, но для nginx это чудеса и излечило мою месячную головную боль.