|
ftp_nb_fput
Stores a file from an open file to the FTP server (non-blocking)
(PHP 4 >= 4.3.0, PHP 5)
Example 733. ftp_nb_fput() example<?php Code Examples / Notes » ftp_nb_fputpain
While trying to create a progress bar for uploading files with the ftp_nb_fput() function I've noticed that the ftp_size() function will not work during the upload progess if you are using the same resource handle. <?php // This will not work // ... $ret = ftp_nb_fput($conn_id, $remote_file, $fp, FTP_BINARY); while ($ret == FTP_MOREDATA) { // ... $remote_file_size = ftp_size($conn_id, $remote_file); // ... $ret = ftp_nb_continue($conn_id); } // ... ?> However, by creating a new connection to the server you can retrieve current file size of the uploaded file, then compare it with your local file to calculate the progress. A full example follows: <?php ob_end_flush(); $remote_file = 'remote.txt'; $local_file = 'local.txt'; $fp = fopen($local_file, 'r'); $conn_id = ftp_connect($ftp_server); $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); $ret = ftp_nb_fput($conn_id, $remote_file, $fp, FTP_BINARY); while ($ret == FTP_MOREDATA) { // Establish a new connection to FTP server if(!isset($conn_id2)) { $conn_id2 = ftp_connect($ftp_server); $login_result2 = ftp_login($conn_id2, $ftp_user_name, $ftp_user_pass); } // Retreive size of uploaded file. if(isset($conn_id2)) { clearstatcache(); // <- this must be included!! $remote_file_size = ftp_size($conn_id2, $remote_file); } // Calculate upload progress $local_file_size = filesize($local_file); if (isset($remote_file_size) && $remote_file_size > 0 ){ $i = ($remote_file_size/$local_file_size)*100; printf("%d%% uploaded ", $i); flush(); } $ret = ftp_nb_continue($conn_id); } if ($ret != FTP_FINISHED) { print("There was an error uploading the file... "); exit(1); } else { print("Done. "); } fclose($fp); ?> jascha
There is an easy way to check progress while uploading a file. Just use the ftell function to watch the position in the file handle. ftp_nb_fput will increment the position as the file is transferred. Example: <? $fh = fopen ($file_name, "r"); $ret = ftp_nb_fput ($ftp, $file_name, $fh, FTP_BINARY); while ($ret == FTP_MOREDATA) { print ftell ($fh)."\n"; $ret = ftp_nb_continue($ftp); } if ($ret != FTP_FINISHED) { print ("error uploading\n"); exit(1); } fclose($fh); ?> This will print out the number of bytes transferred thus far, every time the loop runs. Coverting this into a percentage is simply a matter of dividing the number of bytes transferred by the total size of the file. |
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 |