(PHP 4 >= 4.3.0, PHP 5)
ftp_nb_fput — Speichert eine geöffnete Datei auf den FTP-Server (nicht blockierend)
ftp_nb_fput() lädt Datei von einem Dateizeiger in eine entfernte Datei auf einem FTP-Server.
Der Unterscheid zwischen dieser Funktion und ftp_fput() ist, dass diese Funktion die Datei asynchron hochlädt, so dass Ihr Programm noch andere Operationen ausführen kann während die Datei hochgeladen wird.
Der Verbindungshandler der FTP-Verbindung.
Der Pfad zur Datei auf dem Server.
Ein geöffneter Dateizeiger zu einer lokalen Datei. Das Lesen wird am Dateiende beendet.
Der Transfer-Modus. Muss entweder FTP_ASCII oder FTP_BINARY sein.
Gibt FTP_FAILED oder FTP_FINISHED oder FTP_MOREDATA zurück.
Beispiel #1 ftp_nb_fput()-Beispiel
<?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);
// Upload initialisieren
$ret = ftp_nb_fput($conn_id, $file, $fp, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
// Irgendwas machen
echo ".";
// Upload fortsetzen
$ret = ftp_nb_continue($conn_id);
}
if ($ret != FTP_FINISHED) {
echo "Beim Transfer trat ein Fehler auf";
exit(1);
}
fclose($fp);
?>
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.
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<br>", $i);
flush();
}
$ret = ftp_nb_continue($conn_id);
}
if ($ret != FTP_FINISHED) {
print("There was an error uploading the file...<br>");
exit(1);
}
else {
print("Done.<br>");
}
fclose($fp);
?>