Reputation: 71
I am trying to upload multiple files via Net::FTP and Perl. Has anyone done this as even my basic script below fails?
use Net::FTP;
use File::Basename;
my $ftp;
my $host ='56.309.24.2';
my $user ='user';
my $pw ='pass';
my $file ='097360718843.jpeg';
my $path ='public_html/uploaded/product_images';
chomp($host,$user,$pw,$path, $file);
$ftp=Net::FTP->new($host) or die "could not login";
$ftp->login($user,$pw) or die "could not login";
$ftp->cwd($path) or die "could not cwd $path";
$ftp->ls;
$ftp->put($file) or die "could not put $file";
$ftp->site("chmod 600 " . basename($file));
Here's a log of the transfer:
Net::FTP>>>
Net::FTP(2.75)
Net::FTP>>> Exporter(5.58)
Net::FTP>>>
Net::Cmd(2.26)
Net::FTP>>> IO::Socket::INET(1.27)
Net::FTP>>> IO::Socket(1.28)
Net::FTP>>> IO::Handle(1.24)
Net::FTP=GLOB(0x180c6a8)<<< 220---------- Welcome to Pure-FTPd [TLS] ----------
Net::FTP=GLOB(0x180c6a8)<<< 220-You are user number 1 of 50 allowed.
Net::FTP=GLOB(0x180c6a8)<<< 220-Local time is now 16:19. Server port: 21.
Net::FTP=GLOB(0x180c6a8)<<< 220-IPv6 connections are also welcome on this server.
Net::FTP=GLOB(0x180c6a8)<<< 220 You will be disconnected after 15 minutes of inactivity.
Net::FTP=GLOB(0x180c648)>>> user user_name
Net::FTP=GLOB(0x180c648)<<< 331 User user_name OK. Password required
Net::FTP=GLOB(0x180c648)>>> PASS ....
Net::FTP=GLOB(0x180c648)<<< 230-User user_name has group access to: user_name wheel
Net::FTP=GLOB(0x180c648)<<< 230 OK. Current restricted directory is /
Net::FTP=GLOB(0x180c648)>>> CWD public_html/uploaded/product_images/
Net::FTP=GLOB(0x180c648)<<< 250 OK. Current directory is /public_html/uploaded/product_images
Net::FTP=GLOB(0x180c648)>>> PORT 192,168,1,10,200,38
Net::FTP=GLOB(0x180c648)<<< 200 PORT command successful
Net::FTP=GLOB(0x180c648)>>> NLST
Net::FTP=GLOB(0x180c648)<<< 150 Connecting to port 50703
Net::FTP=GLOB(0x180c648)<<< 226-Options: -a
Net::FTP=GLOB(0x180c648)<<< 226 Output truncated to 2000 matches
Net::FTP=GLOB(0x180c648)>>> ALLO 7903
Net::FTP=GLOB(0x180c648)<<< 200 Zzz...
Net::FTP=GLOB(0x180c648)>>> PORT 192,168,1,10,200,39
Net::FTP=GLOB(0x180c648)<<< 200 PORT command successful
Net::FTP=GLOB(0x180c648)>>> STOR 097360718843.jpeg
Net::FTP=GLOB(0x180c648)<<< 150 Connecting to port 50704
Net::FTP=GLOB(0x180c648)<<< 226-File successfully transferred
Net::FTP=GLOB(0x180c648)<<< 226 0.381 seconds (measured here), 20.21 Kbytes per second
Net::FTP=GLOB(0x180c648)>>> SITE chmod 600 097360718843.jpeg
Net::FTP=GLOB(0x180c648)<<< 200 Permissions changed on 097360718843.jpeg
Upvotes: 2
Views: 8792
Reputation: 795
The upload is successful:
226-File successfully transferred
and it should be accessible via file url in a web browser. Yet you cannot see it in a ftp client because of ftp server file listing limit - the file quantity exceeds 2000:
226 Output truncated to 2000 matches
The solution would be saving to other folder or if you have access to server-side ftp config changing that file limit.
Upvotes: 0
Reputation: 118118
Use
my $ftp = Net::FTP->new($host, Debug => 1)
or die "Could not create FTP object: $@";
Additional good practice:
Make sure you have
use strict;
use warnings;
Don't declare variables before they are needed.
Include the error in the error messages.
In short, try the following script:
#!/usr/bin/perl
use strict;
use warnings;
use Net::FTP;
my $host ='56.309.24.2';
my $user ='user';
my $pw ='pass';
my $file ='097360718843.jpeg';
my $path ='public_html/uploaded/product_images';
my $ftp = Net::FTP->new($host, Debug => 1)
or die "Could not connect to '$host': $@";
$ftp->login($user, $pw)
or die sprintf "Could not login: %s", $ftp->message;
$ftp->cwd($path)
or die sprintf "Could not login: %s", $ftp->message;
$ftp->ls;
$ftp->binary;
$ftp->put($file)
or die die sprintf "Could not login: %s", $ftp->message;
$ftp->site("chmod 600 $file");
Upvotes: 3
Reputation: 28837
Check the protection on the destination directory. Make sure you can create files there.
Check the protection on the files themselves Make sure you can overwrite them.
Upvotes: 1