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 — Grava um arquivo a partir de um arquivo aberto no servidor FTP (sem bloquear)
Descrição
$ftp_stream
, string $remote_file
, resource $handle
, int $mode
[, int $startpos
] )ftp_nb_fput() envia os dados do ponteiro de arquivo para o arquivo remoto no servidor FTP.
A diferença entra esta função e ftp_fput() é que esta função envia o arquivo de forma assimcronoma, assim o seu programa pode realizar outras operações enquanto o arquivo esta sendo carregado.
Parâmetros
-
ftp_stream -
O identificador da conexão FTP.
-
remote_file -
O caminho para o arquivo remoto.
-
handle -
Um ponteiro de arquivo aberto para o arquivo local. A leitura termina ao finbal do arquivo.
-
mode -
O modo de transferência. Deve ser
FTP_ASCIIouFTP_BINARY. -
startpos
Valor Retornado
Retorna FTP_FAILED ou FTP_FINISHED
ou FTP_MOREDATA.
Exemplos
Exemplo #1 Exemplo 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);
// 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);
?>
Veja Também
- ftp_nb_put() - Grava um arquivo no servidor FTP (sem bloquear)
- ftp_nb_continue() - Continua a receber/enviar um arquivo (sem bloquear)
- ftp_put() - Envia um arquivo para o servidor FTP
- ftp_fput() - Envia um arquivo aberto para um servidor php
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);
?>
