小编iha*_*dez的帖子

使用rails,nginx和send_file在Chrome中流式传输mp4

我不能为我的生活使用html5 <video>标签将mp4流式传输到Chrome .如果我放入文件,public那么一切都很好,并按预期工作.但如果我尝试使用它send_file,几乎所有可以想象的都会出错.我正在使用由nginx代理的rails应用程序,其Video模型具有location磁盘上的绝对路径属性.

起初我尝试过:

def show
  send_file Video.find(params[:id]).location
end
Run Code Online (Sandbox Code Playgroud)

而且我确信我会沉浸在现代网络发展的荣耀之中.哈.这可以在Chrome和Firefox中播放,但既不会寻求,也不会知道视频有多长.我在响应头部戳了戳,意识到它Content-Type正在被发送,application/octet-stream并且没有Content-Length设置.嗯......好吗?

好吧,我想我可以在rails中设置它们:

def show
  video = Video.find(params[:id])
  response.headers['Content-Length'] = File.stat(video.location).size
  send_file(video.location, type: 'video/mp4')
end
Run Code Online (Sandbox Code Playgroud)

在这一点上,一切都与Firefox中预期的一样.它知道视频有多长,并且寻求按预期工作.Chrome似乎知道视频的持续时间(不显示时间戳,但搜索条看起来合适),但搜索不起作用.

显然Chrome比Firefox更挑剔.它要求服务器使用Accept-Ranges带有值的标头进行bytes响应,并响应后续请求(在用户搜索时发生)206以及文件的相应部分.

好的,所以我从这里借了一些代码然后我有了这个:

video = Video.find(params[:id])

file_begin = 0
file_size = File.stat(video.location).size
file_end = file_size - 1

if !request.headers["Range"]
  status_code = :ok
else
  status_code = :partial_content
  match = request.headers['Range'].match(/bytes=(\d+)-(\d*)/)
  if match
    file_begin = match[1] …
Run Code Online (Sandbox Code Playgroud)

apache google-chrome ruby-on-rails nginx html5-video

9
推荐指数
1
解决办法
2967
查看次数

守卫 - 与流浪汉一起生活

我试图使用保护的--listen-on选项与流浪汉所概述这里,但我无法得到它的工作.

如果我添加config.vm.network :forwarded_port, guest: 4000, host: 4000到我的Vagrantfile,然后尝试开始听listen -f 127.0.0.1:4000,我得到一个错误: Broadcaster.initialize: Address already in use - bind(2) for "127.0.0.1" port 4000.

如果我试着开始听,然后开始流浪汉,流浪汉同样抱怨:

Vagrant无法转发此VM上的指定端口,因为它们会与已在这些端口上侦听的其他应用程序发生冲突.转发到4000的端口已在主机上使用.

所以我尝试了一些其他的东西,同时省略了端口4000转发Vagrantfile:

如果我省略了我的端口4000转发Vagrantfile,那么我可以成功开始收听listen -f 127.0.0.1:4000.但是当我guard -o "10.0.2.2:4000" -w "/home/me/my_project/"在我的流浪客人中跑步时,当文件发生变化时,警卫不会做任何事情.添加-v标记到listen呼叫揭示了变化被拾起正确的主机上.

我也尝试listen -f 10.11.12.1:4000在主机上结合使用guard -o "10.11.12.1:4000" -w "/home/me/my_project/"相同的防守结果,当文件发生变化时不做任何事情.

结合listen -f 127.0.0.1:4000guard -o "10.11.12.1:4000" -w "/home/me/my_project/"结果在后卫暂时无法接通.

我也尝试使用ssh进行端口转发: …

rspec ruby-on-rails guard vagrant

6
推荐指数
1
解决办法
1652
查看次数

Rails使用uuids迁移create_join_table

较新版本的rails允许您指定应使用uuid主键创建表,如下所示:

create_table :foos, id: :uuid do |t|
  # ...
end
Run Code Online (Sandbox Code Playgroud)

哪个好.很长一段时间,rails支持创建连接表,如下所示:

create_join_table :foos, :bars do |t|
  # ...
end
Run Code Online (Sandbox Code Playgroud)

也很棒.除了我的表有uuid主键,并生成整数类型的外键列而不是类型uuid.

查看文档create_join_table,我找不到任何明显的更改列类型.可以create_join_table和uuids 一起使用吗?

或者我是否手动创建了连接表:

create_table :bars_foos, id: false do |t|
  t.uuid :bar_id
  t.uuid :foo_id
end
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails rails-activerecord

6
推荐指数
3
解决办法
1357
查看次数