我有一个提供大型(数百 MB)视频文件的应用程序,它在桌面浏览器上运行良好,在 Apache 上使用 Rails + X-Sendfile。一个重要的要求是这些视频必须是私有的并且只对登录用户可见,所以这就是我使用 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
使用这个解决方案,我遇到了大于 50mb 的视频的问题,更重要的是,我给 rails 一个它不应该承担的责任。通过 x-sendfile 模块处理流式传输的重负载应该是 apache。但我不知道怎么做。该send_data
方法没有 x-sendfile 参数,涉及 send_file 方法的解决方案不起作用。
我发现这两个问题与我的相似,但它们不起作用:rails 媒体文件流通过 send_data 或 send_file 方法接受字节范围请求,通过 rails 将 mp4 文件提供给 Ipad 的正确方法是什么?
关于发生了什么的任何线索?几周以来我一直在努力解决这个问题,我需要让它发挥作用。欢迎其他可行的解决方案。