我有一个场景,其中有一个S3 URL,其中包含二进制内容,需要传输到FTP服务器。我使用的是Net::FTP
、open-uri
和Ruby 2.0.0-p353。
require 'net/ftp'
require 'open-uri'
Net::FTP.open(x,y,z) do |ftp|
ftp.putbinaryfile(open(an_s3_url), 'remote_filename', 4096)
上面的代码所做的是在当前目录中创建一个临时open-uriXXYY-*
临时文件,但随后挂起。我不知道为什么。中断功能会产生以下跟踪:
home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:434:in `accept': Interrupt
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:434:in `transfercmd'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:543:in `block (2 levels) in storbinary'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:199:in `with_binary'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:542:in `block in storbinary'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:541:in `storbinary'
from /home/ubuntu/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/net/ftp.rb:690:in `putbinaryfile'
解决方法是检索文件,然后将其放入,但这感觉很笨拙。我不能这样做是有原因的吗,还是我错过了一些显而易见的东西?包含或不包含块大小的问题相同。
答案是使用被动FTP——这是我明显缺少的(?!)东西。
默认情况下,它设置为false。
Net::FTP.open(x,y,z) {|ftp| ftp.passive = true ... }
工作起来很有魅力。