Rails send_file 不播放 mp4

2024-02-22

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

现在我需要播放这些视频,当我在控制器中执行以下操作时:

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

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

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

如果我删除配置:“内联”,它将下载视频,我可以从我的计算机上播放它。 webm 视频也会发生同样的情况。

我缺少什么?这是可以做的事情吗?


要流式传输视频,我们必须处理请求字节范围 https://en.wikipedia.org/wiki/Byte_serving对于某些浏览器。

解决方案 1:使用send_file_with_range gem

最简单的方法是send_file方法修补了send_file_with_range gem https://github.com/adamcooke/send_file_with_range.

将 gem 包含在 Gemfile 中

# Gemfile
gem 'send_file_with_range'

并提供range: true选项send_file:

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

补丁 https://github.com/adamcooke/send_file_with_range/blob/master/lib/send_file_with_range/controller_extension.rb很短,值得一看。 但不幸的是,它不适用于 Rails 4.2。

解决方案2:打补丁send_file手动

受 gem 的启发,手动扩展控制器相当简单:

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: true and range: true,我发现这个railscast很有帮助:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails send_file 不播放 mp4 的相关文章

  • 如何在不加载关联模型的情况下检查 has_one 是否存在

    我有一个简单的 has one 关系 class User lt ApplicationRecord has one detail has many courses end class Detail lt ApplicationRecord
  • Mongoid - 同一外域的两个域的逆

    我试图让以下 Mongoid 关系发挥作用 但每个团队的游戏字段都是一个空数组 这不是一个有效的关系模型吗 我是否需要分开比赛 即主场比赛和客场比赛 class Team include Mongoid Document has many
  • Apple 针对 http 直播流媒体应用程序的政策

    这里有要求 http developer apple com library ios documentation NetworkingInternet Conceptual StreamingMediaGuide UsingHTTPLive
  • 我的整个 Rails 应用程序仅从一个文件获取 css 为什么

    我为两个控制器添加了不同的 css 文件 但我的整个应用程序仅从product css 我为两个控制器添加了不同的 css 文件 但我的整个应用程序仅从product css我为两个控制器添加了不同的 css 文件 但我的整个应用程序仅从p
  • Ruby 未绑定方法:是否可以强制绑定到其他类的实例?

    我想知道我是否可以强迫这种情况发生 class A def bomb bomb end end class B end bomb A instance method bomb b B new bomb bind b 目前它抛出错误 Type
  • SSL_connect 返回=1 errno=0 状态=SSLv3 读取服务器证书 B:证书验证仅在代理时失败

    这篇文章几乎重复了许多其他帖子 包括Rails 4 和 Ruby 2 Net HTTP SSL 请求 OpenSSL SSL SSLError SSL connect returned 1 errno 0 state SSLv2 v3 re
  • 自动测试无限循环

    我在 Rails 项目中使用自动测试时遇到了一个问题 即当测试失败时 即 我修改了测试文件并且自动测试自动运行测试 自动测试会不断尝试运行测试 当然每次都会失败 因为文件尚未被修改 而不是等到文件再次保存 当咆哮通知打开时 当我试图修复代码
  • Rails 4 i18n,如何转换子域用于区域设置的路由

    我正在使用子域来确定 Rails 4 网站中的区域设置 我完全按照我想要的方式使用区域设置切换器 但现在我需要翻译路线 并且我不确定继续的最佳方法 我看过https github com kwi i18n routing https git
  • 当一组工作人员完成时如何执行 Sidekiq 回调

    假设我有一个 Sidekiq 任务将产品处理到我的数据库 每个产品都按商店分组 因此我的代码的一个过于简化的示例将是这样的 stores each do store store products each do product Produc
  • 忽略 git 中的本地配置文件

    Rails 应用程序中有一些本地文件 属于我们存储库的一部分 我希望 git 忽略它们 基本上 我希望 git 忽略我对 config environments 目录和 config application rb 文件中的任何内容所做的所有
  • 红宝石边缘情况

    ruby 有一些边缘情况很难解释 因为解析会带来一些有趣的问题 我在这里列出其中两个 如果您知道更多 请添加到列表中 def foo 5 end this one works if tmp foo puts tmp to s end How
  • 如何在 Rails 控制器中调用通道方法?

    我有一个订阅用户的 ActionCable 方法 如果启动新的 convo 我也希望用户订阅新频道 我无法找出在控制器中调用通道方法的正确语法 更新 问题是消息在发送时附加到聊天框 但是当发送第一条消息时 Websocket 连接尚未建立
  • 可以覆盖/实现的 ruby​​ 运算符列表

    是否有可以覆盖的所有 ruby 运算符的列表 不是那些不能的 Here s Ruby 运算符表 http phrogz net programmingruby language html table 18 4 方法和可重载的有 Elemen
  • 在私有控制器方法中返回redirect_to

    前言 我正在使用设备进行身份验证 我试图阻止未经授权的用户查看 编辑或更新其他用户的信息 我最关心的是用户将 DOM 中的表单修改为另一个用户的 ID 填写表单 然后单击更新 我已经专门阅读过 像下面这样的东西应该有效 但事实并非如此 SO
  • 为什么“捆绑”会在我的开发机器上安装生产 gem?

    Gemfile 说 gem sqlite3 groups gt development test gem mysql2 group gt production 然而当我打字时bundle install在我的开发机器上安装了所有 gem 我
  • 创建一个简单的 Rails 3 文本助手 Gem [重复]

    这个问题在这里已经有答案了 我一直在开发我的第一个 Rails 3 插件 以打包一个我喜欢在ApplicationHelper我所有的应用程序 你可以看到整个代码在 Github 上 https github com burlesona s
  • 资产管道弃用警告 tsort.rb:226

    我的 Rails 4 2 在开发中运行良好 但在生产环境中我收到以下警告 DEPRECATION WARNING The configuration option config serve static assets has been re
  • 如何计算带有偏移量的异或?

    我想用不同的偏移量进行异或计算以在计算中列出 例子 key 0 1 0 text 0 1 0 1 0 1 0 1 1 1 异或计算 key 0 text 0 key 1 text 1 key 2 text 2 key 0 text 3 ke
  • Ruby 枚举器中的“break”与“raise StopIteration”

    如果我使用 Ruby Enumerators 来实现生成器和过滤器 generator Enumerator new do y x 0 loop do y lt lt x x 1 break if x gt CUTOFF end end l
  • 在 ec2 上托管 Rails

    我想将 Rails 部署到亚马逊 ec2 上 我看过 poolparty 和 ec2onrails 但似乎都不再维护了 人们用什么来做到这一点 都是自制的木偶和卡皮斯特拉诺 还是有一个项目可以让我继续下去 我可以推荐两个项目 如果您有一个

随机推荐

  • 有没有JavaScript静态分析工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我做了一些愚蠢的事情 例如变量名拼写错误 时 我习惯于让编译器抱怨 但 JavaScript 习惯于让
  • 为什么我不能直接将 document.getElementById 分配给不同的函数?

    所以我试图定义一个类似于 document getElementById 的函数 g 以下工作正常 var g function id return document getElementById id 但为什么这个更直接的代码不起作用呢
  • dplyr:mutate 内的整数采样

    我正在尝试在中生成一列tbl df这是一个 0 或 1 的随机整数 这是我正在使用的代码 library dplyr set seed 0 Dummy data frame to test df lt tbl df data frame x
  • 设置 Yii2 预览

    Yii2 预览版最近发布 可在github https github com yiisoft yii2 我想对其进行试驾 但到目前为止 文档 几乎立即就过时了 因为它仍在大量开发中 我曾尝试遵循本指南 http www yiiframewo
  • 无法刷新状态存储

    我正在尝试在 Kafka Streams 中创建一个 leftJoin 它对于大约 10 条记录工作正常 然后由于以下原因导致异常崩溃 NullPointerException用这样的代码 private static KafkaStrea
  • 如何在eclipse中同时调试两个项目?

    我有两个项目 consle 和 android 项目 我想比较变量的值 因为相同的代码 正如我认为的 给出了不同的结果 我必须找到错误 如果我按 F6 按钮 状态只会在一个项目中发生变化 是否可以即时切换调试项目 在两个项目中放置断点并以调
  • 尝试使用类型族来消除具有灵活上下文的重叠实例时出错

    我试图在我正在使用的类型的类型参数上使用一些相当复杂的条件来定义类型类的实例 并且认为一个有用的方法是声明一个封闭的类型系列 该系列在我定义的实例之间进行选择 不幸的是 我根本无法让这个想法发挥作用 因为 GHC 抱怨这些实例是重复的 这是
  • grails-app/utils 目录

    我刚刚注意到的存在grails app utils目录 我从未在任何文档中看到过它 或在项目中使用过 它是在运行时默认创建的create app 知道你应该在那里放什么吗 实用程序 代码是一个明显的猜测 但似乎应该放在src dir 谢谢
  • 扩展 JavaScript 字符串中的 ${var} 引用 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 学习一些超越普通 JavaScript 的东西 我正在读的书告诉我这样的说法 let someVar Happy console
  • 从R中的矩阵中删除对角线元素

    如何使用 R 从矩阵 L 中删除对角元素 diagL 我尝试使用以下内容 subset L select diag L or subset L select c diag L 但我得到了 0 个号码 R 编程语言 我更喜欢C 它更容易拼写
  • 带有事务的 SourcePollingChannelAdapter

    我想使用 SourcePollingChannelAdapter 来实现轮询时需要事务传播 以便在发生错误时回滚所有操作 setTransactionSynchronizationFactory 方法没有注释 非常感谢你的帮助 在 XML
  • Kendo UI 参考在 Razor 视图中不起作用

    我正在尝试创建 Telerik 网格视图 但是当我去参考剑道时它无法识别它 当我尝试引用剑道时 Visual Studio 给出错误 这是代码 Html Kendo Grid 下面是错误 System Web Mvc HtmlHelper
  • MongoDB 的插入安全模式有多安全?

    我正在开发一个项目 其中包含一些重要数据 这意味着如果灯或服务器出现故障 我们不会丢失任何数据 我们使用 MongoDB 作为数据库 我想确保插入后我的数据位于数据库中 如果未插入一个元素 则回滚整个批次 我知道 Mongo 背后的理念是我
  • 在 JCuda 中加载多个模块不起作用

    在jCuda中 可以将cuda文件加载为PTX或CUBIN格式并调用 启动 global 来自 Java 的函数 内核 考虑到这一点 我想使用 JCuda 开发一个框架来获取用户的 device 函数在一个 cu文件在运行时加载并运行它 我
  • log4j2.properties 文件的更改导致 elasticsearch 失败

    我已经安装了elasticsearch 6 6 0 和CentOS 7 我想添加一些用于旋转日志的属性 例如大小为50MB的旋转和压缩 但是 如果我向 etc elasticsearch log4j2 properties 文件添加更多配置
  • LINQ 分组依据表达式语法

    我有一个与此类似的 T SQL 查询 SELECT r id r name count FROM RoomBindings GROUP BY r id r name 我想使用 LINQ 做同样的事情 到目前为止我到达这里 var rooms
  • 链接错误“未定义引用‘__gxx_personality_v0’”和g++[重复]

    这个问题在这里已经有答案了 可能的重复 链接上未定义符号 gxx personality v0 https stackoverflow com questions 203548 undefined symbol gxx personalit
  • 带有母版页的 ASP.Net Web 表单中的 JQuery

    我有一个名为 CoursesPage aspx 的页面 它有一个母版页 在 CoursesPage aspx 中 我在课程名称上使用自动完成 jquery 以便更好地搜索 这是我的脚本代码
  • 如何从命令行启动的 GUI 应用程序写入 StdOut?

    我正在 Delphi 7 中编写一个标准的 Windows 应用程序 如果我正在编写控制台应用程序 我可以调用以下命令来输出到命令行或输出文件 writeln Some info 如果我从从命令行启动的标准 GUI 应用程序执行此操作 则会
  • Rails send_file 不播放 mp4

    我有一个 Rails 应用程序 可以保护上传的视频 将它们放入私人文件夹中 现在我需要播放这些视频 当我在控制器中执行以下操作时 def show video Video find params id send file video ful