| Net-FTP-blat documentation | Contained in the Net-FTP-blat distribution. |
Net::FTP::blat - more methods for Net::FTP Client class
use Net::FTP;
use Net::FTP::blat;
# See Net::FTP for how to set up connection
# get a remote file to a scalar
$ftp->slurp(README => my $readme);
# put a scalar to a remote file
$ftp->blat( $blog_entry_text, "entry: ".localtime );
Net::FTP::blat contains two additional methods for Net::FTP.
slurp and blat were written by altering get and put from
Net::FTP to use a scalar instead of a local file for the local side
of the transfer.
Slurp REMOTE_FILE from the server and store locally, into a scalar
variable. Returns the value too, if you don't want to pass the
destination in. Croaks on all errors. Warns on file-not-found before
assigning undef, if warnings are in effect.
Blat the local scalar into the named file on the remote server. The remote name is required. Returns the scalar, for use in assignment chaining. Croaks on errors.
Net::FTP error messages are not imported into the croak exceptions at this version. They may be in the future.
I would like to see slurp and blat included in the Net::FTP
distribution. I was surprised that they (or equivalents)
were not included.
If ever the probelms with AUTOLOAD and Net::FTP are resolved, in my opinion that would be a good time to add these methods.
David Nicol <davidnico@cpan.org>
These methods are derived from the get and put methods in Net::FTP, by Graham Barr.
Copyright 2003 David Nicol
These methods are free software; you can redistribute and/or modify them under the same terms as Perl itself.
| Net-FTP-blat documentation | Contained in the Net-FTP-blat distribution. |
package Net::FTP::blat; use strict; use Carp; use vars '$VERSION'; $VERSION = 0.02; sub Net::FTP::slurp # store a remote file to a scalar # syntax: $ftpobj->slurp($remote_file_name [, $lvalue ] ) { my($ftp,$remote) = @_[0,1]; my $target = ( exists($_[2])? \$_[2] : \(my $foo)); my($len,$buf,$resp,$data); croak("Bad remote filename '$remote'\n") if $remote =~ /[\r\n]/s; delete ${*$ftp}{'net_ftp_port'}; delete ${*$ftp}{'net_ftp_pasv'}; unless( $data = $ftp->retr($remote)){ $^W and carp "could not retr [$remote]"; $$target=undef; return undef; }; $buf = ''; my($count) = (0); my $blksize = ${*$ftp}{'net_ftp_blksize'}; local $\; # Just in case my @pieces = (); while( $data->read($buf,$blksize) ){ push @pieces, $buf; }; $data->close(); # implied $ftp->response if (defined(wantarray)){ $$target = my $result = join('',@pieces); return $result }; $$target = join('',@pieces); }; sub Net::FTP::blat # STOR a scalar to a remote file # syntax: $ftpobj->blat($value,$remote) { my($ftp,$remote) = @_[0,2]; my $value = \$_[1]; my($sock,$len,$buf); unless(defined $remote) { croak 'Must specify remote filename with stream input'; }; # ALLO $ftp->_ALLO( length $$value); croak("Bad remote filename '$remote'\n") if $remote =~ /[\r\n]/s; delete ${*$ftp}{'net_ftp_port'}; delete ${*$ftp}{'net_ftp_pasv'}; $sock = $ftp->_data_cmd('STOR', $remote) or croak "failure of STOR [$remote] data_cmd"; # #chunking really only makes sense when we're reading #from disk and sending. Since we're sending a scalar, #we can avoid multiple substr calls , each of which #will need to do a full FETCH on a tied scalar, and just #write the whole thing at once. # # my $blksize = ${*$ftp}{'net_ftp_blksize'}; # # my($pos) = (0); # # while( # $len = length ( $buf = substr ( $$value, $pos, $blksize)) # ){ # # my $wlen; # unless(defined($wlen = $sock->write($buf,$len)) && $wlen == $len) # { # $sock->abort; # croak "only wrote $wlen of $len data to FTP data channel at [$remote]:$pos\n"; # } # $pos += $len; # } $len = length $$value; my $wlen; unless(defined($wlen = $sock->write($$value,$len)) && $wlen == $len) { $sock->abort; croak "only wrote $wlen of $len data to FTP data channel at [$remote] "; } $sock->close(); $$value; } __END__