|
ftp_get
Downloads a file from the FTP server
(PHP 4, PHP 5)
Example 727. ftp_get() example<?php Code Examples / Notes » ftp_getanomie
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 Languageftp_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 |