【问题标题】:Using Rails to transfer files from a remote server to another (FTP or Rsync or SCP etc..)使用 Rails 将文件从远程服务器传输到另一个服务器(FTP 或 Rsync 或 SCP 等。)
【发布时间】:2013-05-01 18:02:10
【问题描述】:

我有一个视频转码服务器,当视频被转码时我需要将转换后的视频版本发送到 CDN,并向我的 CMS 管理员显示进程的进度

起初(我想就像大多数其他 RoR 开发人员一样:)我为此寻找了一个 gem。老实说,我找不到一个。这让我想到我错过了什么。

当我四处搜索时,只需得到“paperclip”和“carrierview”作为答案。但我不希望 gem 让用户将文件上传到服务器。 我想将文件从我的服务器复制到另一台服务器

经过一番研究,我发现了一个名为Net::SCP 的原生Ruby 类,它有一个进度报告参数。我将 Resque 用于后台进程。所以我可能会使用 这个。

但是,当我使用这个块时:

scp.upload!("/path/to/local", "/path/to/remote") do |ch, name, sent, total|   
puts "#{name}: #{sent}/#{total}" 
end

非常频繁地回调“发送”参数。我认为,每秒向我的数据库发送大约 5 个更新查询不是一个好主意?这种情况有解决办法吗?

那么你建议我怎么做?我要求的目的是否有宝石?或者我应该使用什么?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 ftp file-transfer


    【解决方案1】:

    您可以增加Net::SCP#upload! 的块大小选项,如the documentation implies

    每当一个新的数据块 [...] 发送到一个文件时,[给 upload 的块] 将被调用 [...]

    还有#upload:

    :chunk_size - 应该发送的每个“块”的大小。默认为 2048。更改此值可能会提高吞吐量,但会降低交互性。

    ……这就是你想要的。

    chunk_size = 100.kilobytes
    scp.upload!(local_fname, remote_fname, chunk_size: chunk_size) do |ch, name, sent, total|   
      puts "#{name}: #{sent}/#{total}"
    end
    

    【讨论】:

    • 嘿!非常感谢您的回答!我想这绝对是我正在寻找的!但是......我不清楚间隔。 2048 究竟是什么?我应该减少还是增加它?
    • 好吧,我使用了 try and fail 方法,发现块越大,回调的延迟就越多。非常感谢您的回答!
    • 我猜chunk_size 指的是一次提交的字节数。所以增加(在我的例子中从 2k 到 100k)应该是要走的路。
    猜你喜欢
    • 2014-11-18
    • 1970-01-01
    • 2015-05-24
    • 2016-05-03
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多