Net::FTP и open-uri зависают при попытке поместить двоичный файл с URL на FTP-сервер
У меня есть сценарий, где у меня есть 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'
Обходной путь должен получить файл и затем поместить это, но это чувствует себя неуклюжим. Есть ли причина, по которой я не могу сделать это таким образом, или я упускаю что-то очевидное? Та же проблема с или без размера блока включены.
1 ответ
Ответ состоял в том, чтобы использовать пассивный FTP - это была очевидная (?!) вещь, которую я пропустил.
По умолчанию установлено значение false.
Net::FTP.open(x,y,z) {|ftp| ftp.passive = true ... }
Работал как шарм.