【问题标题】:ruby on rails send_file delay with large filesruby on rails send_file 延迟大文件
【发布时间】:2014-06-29 03:51:32
【问题描述】:

我一直在使用 Rails 服务器,当我在其他地方时,我可以使用它来访问存储在我的公寓中的驱动器上的文件。为了处理下载,我编写了以下控制器:

class DownloadController < ApplicationController
  def index
    @title = params[:title]
    @name = params[:name]
    @path = '/media/video/'+@title+'/'+@name
    call_to_download(@path)
  end

  def call_to_download(path)
    send_file( path, :x_sendfile=>true )
  end
end

这对图像等小文件非常有效,但是当我尝试下载视频剪辑(大约 500 MB)时,实际开始下载大约需要一分钟。 我四处寻找解决此问题的方法,但一无所获,不胜感激!

【问题讨论】:

  • 尝试减小缓冲区大小:send_file(path, x_sendfile: true, buffer_size: 512)
  • 遗憾的是它没有改变任何东西
  • 你使用什么服务器? Apache、Thin、nginx、Webbrick?
  • 我对 Rails 还很陌生,但由于我没有更改它,我假设它是 Webbrick(默认?)

标签: ruby-on-rails ruby file delay send


【解决方案1】:

Webbrick 不支持x_sendfile。因此,它必须在开始响应之前将文件完全加载到内存中并将其拆分为块(IMO 默认为 4K)。此外,它在执行此操作时会阻止整个网络服务器。我对这很慢并不感到惊讶。

我建议使用支持x_sendfile 的网络服务器,例如带有乘客的 apache。

顺便说一句,直接从用户输入生成路径可能是一个安全漏洞。猜猜当有人将您的database.yml 的路径输入params[:title]params[:name] 时会发生什么...

【讨论】:

  • 哦,原来如此,解释了很多!至少我在学习,非常感谢!
猜你喜欢
  • 1970-01-01
  • 2014-01-05
  • 2023-04-08
  • 2013-03-05
  • 2020-09-03
  • 2017-11-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
相关资源
最近更新 更多