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.
ftp_nb_fput
(PHP 4 >= 4.3.0, PHP 5)
ftp_nb_fput — Almacena un archivo desde un archivo abierto en el servidor FTP (modo no-bloqueo)
Descripción
$ftp_stream
, string $remote_file
, resource $handle
, int $mode
[, int $startpos = 0
] )ftp_nb_fput() carga los datos desde un apuntador de archivo a un archivo remoto en el servidor FTP.
La diferencia entre esta función y ftp_fput() es que esta función carga el archivo de forma asincrónica, de modo que su programa puede realizar otras operaciones mientras el archivo está siendo cargado.
Parámetros
-
ftp_stream -
El identificador de enlace de la conexión FTP.
-
remote_file -
La ruta del archivo remoto.
-
handle -
Un apuntador de archivo abierto en el archivo local. La lectura se detiene al final del archivo.
-
mode -
El modo de transferencia. Debe ser
FTP_ASCIIoFTP_BINARY. -
startpos -
La posición en el archivo remoto para empezar a subirlo.
Valores devueltos
Devuelve FTP_FAILED o FTP_FINISHED
o FTP_MOREDATA.
Ejemplos
Ejemplo #1 Ejemplo de ftp_nb_fput()
<?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);
// Iniciar la carga
$ret = ftp_nb_fput($conn_id, $file, $fp, FTP_BINARY);
while ($ret == FTP_MOREDATA) {
// Haga lo que quiera
echo ".";
// Continuar la carga...
$ret = ftp_nb_continue($conn_id);
}
if ($ret != FTP_FINISHED) {
echo "Hubo un error al subir el archivo...";
exit(1);
}
fclose($fp);
?>
Ver también
- ftp_nb_put() - Almacena un archivo en el servidor FTP (modo no-bloqueo)
- ftp_nb_continue() - Continúa recuperando/enviando un archivo (modo no-bloqueo)
- ftp_put() - Carga un archivo al servidor FTP
- ftp_fput() - Carga un archivo abierto en el servidor FTP
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);
?>
