http://www.perlmonks.org?node_id=1051858

Only1KW has asked for the wisdom of the Perl Monks concerning the following question:

I thought I already posted on this earlier today, but I can't find the post so I'll write it again.

I have the following code which uses Net::FTP:

my $ftp = Net::FTP->new($ftpServer, Debug => 0) or die "Cannot connect + to $ftpServer: $@"; $ftp->login($ftpUsername, $ftpPassword) or die 'Cannot login: ' . +$ftp->message . "\n"; $ftp->mkdir($webServerDir); $ftp->cwd($webServerDir) or die "Cannot change working directory t +o $webServerDir: " . $ftp->message . "\n"; $ftp->put($file) or die "Cannot copy file to server: " . $ftp->mes +sage . "\n";

When I run it for a given file and server, I get the following response from the script:

Cannot copy file to server: Accepted data connection

I've checked manually, and as far as I can tell, the file uploaded to the FTP server successfully and completely. Also, this appears to indicate FTP status code 150, which isn't an error. However, all my research on the put method of Net::FTP indicates the "or die" syntax is the correct way to display errors that occur during upload. Is this a bug in Net::FTP, do I need to check the status code and special-case non-zero non-error status', or something else?

Replies are listed 'Best First'.
Re: Accepted Data Connection "error" using put method of Net::FTP
by kschwab (Vicar) on Sep 02, 2013 at 04:15 UTC
    It appears that $ftp->put is supposed to return the remote filename created. Being a little pedantic, it seems the right thing to test for would be if the return value is defined. Suppose you "put" a file named '0'. Your current test would fail. Try defined($ftp->put($file)) or die(); Also print out the value of $! in your die statement, it might be helpful.

    Looking quickly at the source for Net::FTP, another thing you might try is using $ftp->put_unique instead of $ftp->put. It flows through some different logic where the return value is set a bit differently. Same goes for calling $ftp->binary before doing the put. Slightly different logic that could affect the return value.
      I added the binary call and tried uploading the same file again. It worked this time. I'll see if it continues to work over time. Thanks!