++ed by:
Author image Mark Overmeer
and 1 contributors


Net::FTP::Robust - download files over FTP


 my $ftp = Net::FTP::Robust->new
  ( Host    => $host
  , Port    => $port
  , Passive => 1

 # when needed, many attempts will be made to retrieve all
 $ftp->get($remote_dir, $local_dir);

 # to get client-side errors as well:
 use Log::Report;       # get 'try()'
 try { $ftp->get(...) };
 if($@) {...}

 # make the process more verbose, start with
 Log::Report mode => 'VERBOSE';
 Log::Report mode => 'DEBUG';

 # to catch all reports: errors, warnings, debugs etc
 try { $ftp->get(...) } mode => 'DEBUG';
 push @trace, $@->exceptions; # simply prints all
 $@->reportFatal;             # re-cast real errors


This module is specialized in (on the moment only) downloading large data-sets (gigabytes) autonomously. It uses Net::FTP, and adds various algorithms to work around various common problems. In general, local errors are fatal and server or network errors are recovered.

See "DETAILS" far down on this page for more explanations and limitations.




Use to connect to one ftp-server. All OPTIONS which start with capitals are passed to Net::FTP method new().

 -Option        --Default
  host            <undef>
  login_attempts  10
  login_delay     60
  password        '-anonymous@'
  skip_names      <skip hidden files>
  user            'anonymous'
host => HOSTNAME

Alternative for the Host parameter for Net::FTP subroutine new.

login_attempts => INTEGER

How often will the connection be rebuilt. Between each attempt, we wait login_delay seconds. When '0' is specified, it will continue forever: you can solve problems discovered in the logs.

login_delay => INTEGER

How much time to wait between retries which require to login again, in seconds.

password => STRING
skip_names => CODE

Do not attempt directories or files which contain certain patterns. When the CODE returns 1, then the element will be ignored. Typically, the CODE will apply some regular expressions.

The CODE reference will get three arguments: the ftp object (Net::FTP) with established connection, the full remote path of the entry, and the basename of the entry.

user => STRING


$obj->get( FROM, [TO] )

The FROM directory or file on the remote server is copied TO a local directory (defaults to '.')



Net::FTP implements the FTP protocol. Various modules on CPAN asbtract the transport protocol further, for instance Net::FTP::Recurse. Each module has its own focus. Net::FTP::Robust is specialized in retries and logging, to retrieve data which takes hours to download, sometimes over quite instable connections. It uses Log::Report which can connect to various logging frameworks for its messages.


The get() will collect directories recursively or single files.

When a new get() is ran with the same destination directory, then the download will continue where it left-of. Files which were only partially downloaded will get downloaded only for the missing part.

Files will not get deleted, not on the server and not on the client. Symbolic links on the server are invisible on the local copy.

When downloading, the name of the directory and file will temporarily be mangled: only when the download is completed, the real name will show up. For UNIX, the names will temporarily start with a dot, to be hidden from the standard ls(1) output.

When you have the permission from your OS, the modification time will get copied from the source as well.


This module is part of Net-FTP-Robust distribution version 0.09, built on January 22, 2018. Website: http://perl.overmeer.net/CPAN/. See also Net::FTPSSL.


Copyrights of the perl code and the related documentation by 2009-2018 by [Mark Overmeer]. For other contributors see ChangeLog.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. See http://dev.perl.org/licenses/