18

我有一个提供大型(数百 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 的正确方法是什么?

关于发生了什么的任何线索?几周以来我一直在努力解决这个问题,我需要让它发挥作用。欢迎其他可行的解决方案。

4

3 回答 3

1

您是否在您的环境中启用了 X-Sendfile 配置?包括config.action_dispatch.x_sendfile_header = "X-Sendfile"Apache 的行。然后,服务器将使用该标头发送文件。

于 2018-03-13T14:42:55.237 回答
1

检查 apache 请求正文大小是否也足够大。

于 2019-10-29T20:28:15.633 回答
1

这可能完全不相关,因为我将 nginx 用于服务器,但如果它仅不适用于 ios,请查看此博客文章。Apache 可能有类似的解决方案。

从某种意义上说,我必须添加一个内部重定向到文件夹路径的代理标头。这看起来多么愚蠢,Apple 存在某种隐私问题,这使得播放音频和视频文件成为必要。再次不确定这是否是您的解决方案,但对于 nginx,这确实奇迹并治愈了我长达一个月的头痛。

于 2016-07-31T02:27:44.030 回答