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 это чудеса и излечило мою месячную головную боль.