gpt4 book ai didi

ruby-on-rails - Rails send_file 不播放 mp4

转载 作者:数据小太阳 更新时间:2023-10-29 07:30:36 26 4
gpt4 key购买 nike

我有一个 Rails 应用程序可以保护上传的视频并将它们放入私有(private)文件夹。

现在我需要播放这些视频,当我在 Controller 中做这样的事情时:

  def show
video = Video.find(params[:id])
send_file(video.full_path, type: "video/mp4", disposition: "inline")
end

然后在/videos/:id 打开浏览器(Chrome 或 FF)它不播放视频。

如果我将相同的视频放在公用文件夹中,然后像/video.mp4 一样访问它,它就会播放。

如果我删除 dispositon: "inline"它将下载视频并且我可以从我的计算机上播放它。 webm 视频也是如此。

我错过了什么?这有可能吗?

最佳答案

要流式传输视频,我们必须处理请求的 byte range对于某些浏览器。

解决方案 1:使用 send_file_with_range gem

最简单的方法是使用send_file_with_range gem 修补send_file 方法。 .

将 gem 包含在 Gemfile 中

# Gemfile
gem 'send_file_with_range'

并为 send_file 提供 range: true 选项:

def show
video = Video.find(params[:id])
send_file video.full_path, type: "video/mp4",
disposition: "inline", range: true
end

The patch很短,值得一看。但是,不幸的是,它不适用于 Rails 4.2。

解决方案 2:手动修补 send_file

受 gem 的启发,手动扩展 Controller 相当容易:

class VideosController < ApplicationController

def show
video = Video.find(params[:id])
send_file video.full_path, type: "video/mp4",
disposition: "inline", range: true
end

private

def send_file(path, options = {})
if options[:range]
send_file_with_range(path, options)
else
super(path, options)
end
end

def send_file_with_range(path, options = {})
if File.exist?(path)
size = File.size(path)
if !request.headers["Range"]
status_code = 200 # 200 OK
offset = 0
length = File.size(path)
else
status_code = 206 # 206 Partial Content
bytes = Rack::Utils.byte_ranges(request.headers, size)[0]
offset = bytes.begin
length = bytes.end - bytes.begin
end
response.header["Accept-Ranges"] = "bytes"
response.header["Content-Range"] = "bytes #{bytes.begin}-#{bytes.end}/#{size}" if bytes

send_data IO.binread(path, length, offset), options
else
raise ActionController::MissingFile, "Cannot read file #{path}."
end
end

end

进一步阅读

因为起初我不知道 stream: truerange: true 之间的区别,所以我发现这个 railscast 很有帮助:

http://railscasts.com/episodes/266-http-streaming

关于ruby-on-rails - Rails send_file 不播放 mp4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13280044/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com