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



PHP : Function Reference : FTP Functions : ftp_nb_fput

ftp_nb_fput

Stores a file from an open file to the FTP server (non-blocking) (PHP 4 >= 4.3.0, PHP 5)
int ftp_nb_fput ( resource ftp_stream, string remote_file, resource handle, int mode [, int startpos] )

Example 733. ftp_nb_fput() example

<?php

$file
= 'index.php';

$fp = fopen($file, 'r');

$conn_id = ftp_connect($ftp_server);

$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

// Initate the upload
$ret = ftp_nb_fput($conn_id, $file, $fp, FTP_BINARY);
while (
$ret == FTP_MOREDATA) {

 
// Do whatever you want
 
echo ".";

 
// Continue upload...
 
$ret = ftp_nb_continue($conn_id);
}
if (
$ret != FTP_FINISHED) {
  echo
"There was an error uploading the file...";
  exit(
1);
}

fclose($fp);
?>

Code Examples / Notes » ftp_nb_fput

pain

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 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