Net::FTP и open-uri зависают при попытке поместить двоичный файл с URL-адреса на FTP-сервер

У меня есть сценарий, в котором у меня есть URL-адрес S3 с двоичным содержимым, которое необходимо передать на 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-* temp в текущем каталоге, но затем зависает. Понятия не имею почему. Прерывание функции производит следующую трассировку:

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'

Обходной путь — получить файл, а затем поместить его, но это кажется неуклюжим. Есть ли причина, по которой я не могу сделать это таким образом, или я упускаю что-то очевидное? Та же проблема с включенным размером блока или без него.


person Sam Halicke    schedule 24.04.2014    source источник


Ответы (1)


Ответ заключался в том, чтобы использовать пассивный FTP — это была очевидная (?!) вещь, которую мне не хватало.

По умолчанию установлено значение false.

Net::FTP.open(x,y,z) {|ftp| ftp.passive = true ... }

Работал как шарм.

person Sam Halicke    schedule 24.04.2014
comment
Я использовал ftp.passive = true, и это сработало как шарм - person Avishai; 05.10.2016