Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : FTP Functions : ftp_get

ftp_get

Downloads a file from the FTP server (PHP 4, PHP 5)
bool ftp_get ( resource ftp_stream, string local_file, string remote_file, int mode [, int resumepos] )

Example 727. ftp_get() example

<?php

// define some variables
$local_file = 'local.zip';
$server_file = 'server.zip';

// set up basic connection
$conn_id = ftp_connect($ftp_server);

// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// try to download $server_file and save to $local_file
if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
   echo
"Successfully written to $local_file\n";
} else {
   echo
"There was a problem\n";
}

// close the connection
ftp_close($conn_id);

?>

Code Examples / Notes » ftp_get

anomie

Why there isn't an "ftp_get_contents" function, I don't know. It takes a little work to emulate one, but it's doable.
<?php
function ftp_get_contents($ftp_stream, $remote_file, $mode, $resume_pos=null){
   $pipes=stream_socket_pair(STREAM_PF_UNIX, STREAM_SOCK_STREAM, STREAM_IPPROTO_IP);
   if($pipes===false) return false;
   if(!stream_set_blocking($pipes[1], 0)){
       fclose($pipes[0]); fclose($pipes[1]);
       return false;
   }
   $fail=false;
   $data='';
   if(is_null($resume_pos)){
       $ret=ftp_nb_fget($ftp_stream, $pipes[0], $remote_file, $mode);
   } else {
       $ret=ftp_nb_fget($ftp_stream, $pipes[0], $remote_file, $mode, $resume_pos);
   }
   while($ret==FTP_MOREDATA){
       while(!$fail && !feof($pipes[1])){
           $r=fread($pipes[1], 8192);
           if($r==='') break;
           if($r===false){ $fail=true; break; }
           $data.=$r;
       }
       $ret=ftp_nb_continue($ftp_stream);
   }
   while(!$fail && !feof($pipes[1])){
       $r=fread($pipes[1], 8192);
       if($r==='') break;
       if($r===false){ $fail=true; break; }
       $data.=$r;
   }
   fclose($pipes[0]); fclose($pipes[1]);
   if($fail || $ret!=FTP_FINISHED) return false;
   return $data;
}
?>
Something similar would work to write a ftp_put_contents function, too.


corey-holzer

The zero size file is not a side effect.  When the ftp_get starts the first thing it does is to create the inode/file which it will stream the data too and that is a zero size file with the nname you specified for the local file.  When the download fails it leaves the file in place.

ramiro

Keep in mind that ftp_get will overwrite the file on your local machine if it has the same name.

thivierr

If you previously downloaded a file before (like a huge web log), and just want to get the remaining portion, do this:
$local_file_size = filesize($local_file_path);
$get_result = ftp_get($conn_id, $local_file_path, $remote_file_path, FTP_BINARY, $local_file_size);
This same code works regardless of wether the local file exists already or not.  You should first test to make sure the local file is not bigger than the remote file.


administrator

Hello everybody,
If someone will try to download files to the same local file (some temporary file), like shown here:
<?php
foreach ($files as $key=>$path) {
...
 $result = ftp_get($ftpConnId, 'temp.tmp', $path, FTP_BINARY);
...
}
?>
please take in consideration the fact that you will have big problems with downloading (getting) hole files. In other words ‘temp.tmp’ file always will have the same size equal to first downloaded file despite the real size of downloading file. I have not idea what is the reason!
If someone will think that problem is just in getting proper file size (which you will get using filssize() function) he will be mistaken. The download file’s size is not equal to source file’s size materially, that means fflush() function will not solve the problem (I have tried this as well).
Finally the solution was founded: before downloading a file you will need to delete local file if such exist (‘temp.tmp’). So working code will look like:
<?php
foreach ($files as $key=>$path) {
...
 if (file_exists('temp.tmp')) {
   unlink('temp.tmp');
 }
 $result = ftp_get($ftpConnId, 'temp.tmp', $path, FTP_BINARY);
...
}
?>
Good luck in scripting :-)
Vitali Simsive


anomie

Crud. The _nb_ only refers to reading from the ftp server, and the buffer in the socket pair is only about 364 bytes. So it doesn't work for files larger than that size.

Change Language


Follow Navioo On Twitter
ftp_alloc
ftp_cdup
ftp_chdir
ftp_chmod
ftp_close
ftp_connect
ftp_delete
ftp_exec
ftp_fget
ftp_fput
ftp_get_option
ftp_get
ftp_login
ftp_mdtm
ftp_mkdir
ftp_nb_continue
ftp_nb_fget
ftp_nb_fput
ftp_nb_get
ftp_nb_put
ftp_nlist
ftp_pasv
ftp_put
ftp_pwd
ftp_quit
ftp_raw
ftp_rawlist
ftp_rename
ftp_rmdir
ftp_set_option
ftp_site
ftp_size
ftp_ssl_connect
ftp_systype
eXTReMe Tracker