Guys,
Good afternoon.

This PHP feature is already known to many people, but if this is not the case, I will try to help those who do not yet know this powerful PHP feature, which is integration with servers using the FTP protocol, which allows us to transfer files between servers.

Connecting to the server

public function conectarFTP()
{

    $servidor = 'ftp.servidor.com.br'; // Endereço
    $usuario = 'usuario_ftp'; // Usuário
    $senha = 'senha_ftp'; // Senha
    $porta = 21; // Porta padrão
    $timeout = 9000; // Tempo em segundos para encerrar a conexão caso não haja resposta


    $ftp = ftp_connect( $servidor, $porta, $timeout ); // Retorno: true ou false
    if ( !$ftp )
    {
        return false;
    }


    $login = ftp_login( $ftp, $usuario, $senha ); // Retorno: true ou false
    if ( !$login )
    {
        return false;
    }


    return $ftp;

}

Sending files

public function enviarArquivosPorFTP( $strArquivoLocal, $strArquivoRemoto )
{

    $ftp = $this->conectarFTP();
    if ( !is_resource( $ftp ) )
    {
        return false;
    }


    if ( !is_file( $strArquivoLocal ) )
    {
        echo "<br/>Arquivo de origem '{$strArquivoLocal}' não existe!";
        return false;
    }


    // Alterna o modo de conexão para PASSIVO. No modo passivo, as conexões de dados são iniciadas pelo cliente, ao invés do servidor. Pode ser necessário se o cliente estiver atrás de um firewall.
    ftp_pasv( $ftp, true );

    
    // Faz o upload do arquivo no modo BINÁRIO (Deve ser FTP_ASCII ou FTP_BINARY.)
    $envio = ftp_put( $ftp, $strArquivoRemoto, $strArquivoLocal, FTP_BINARY ); // Retorno: true / false


    if ( $envio )
    {
        echo "<br/>Arquivo '{$strArquivoLocal}' enviado para o FTP como '{$strArquivoRemoto}'!";
    }
    else
    {
        echo "<br/>Falha ao enviar o arquivo {$strArquivoLocal} para o FTP!";
        
        ftp_close( $ftp ); // Fecha a conexão com o FTP
        return false;
    }


    ftp_close( $ftp ); // Fecha a conexão com o FTP


    return true;


}

Downloading files

public function baixarArquivosPorFTP( $strArquivoRemoto, $strArquivoLocal )
{

    $ftp = $this->conectarFTP();
    if ( !is_resource( $ftp ) )
    {
        return false;
    }


    // Alterna o modo de conexão para PASSIVO. No modo passivo, as conexões de dados são iniciadas pelo cliente, ao invés do servidor. Pode ser necessário se o cliente estiver atrás de um firewall.
    ftp_pasv( $ftp, true );

    
    // Faz o download do arquivo no modo BINÁRIO (Deve ser FTP_ASCII ou FTP_BINARY.)
    $download = ftp_get( $ftp, $strArquivoLocal, $strArquivoRemoto, FTP_BINARY ); // Retorno: true / false


    if ( $download )
    {
        echo "<br/>Arquivo '{$strArquivoRemoto}' baixado com sucesso do FTP para '{$strArquivoLocal}'";
    }
    else
    {
        echo "<br/>Falha ao baixar o arquivo {$strArquivoRemoto} do FTP!";
        
        ftp_close( $ftp ); // Fecha a conexão com o FTP
        return false;
    }


    ftp_close( $ftp ); // Fecha a conexão com o FTP


    return true;


}

Listing files

public function listarArquivosPorFTP( $strDiretorio, $strBusca )
{

    $ftp = $this->conectarFTP();
    if ( !is_resource( $ftp ) )
    {
        return false;
    }


    // Alterna o modo de conexão para PASSIVO. No modo passivo, as conexões de dados são iniciadas pelo cliente, ao invés do servidor. Pode ser necessário se o cliente estiver atrás de um firewall.
    ftp_pasv( $ftp, true );


    // Altera o diretório atual para "/arquivos/fotos/"
    ftp_chdir($ftp, "/arquivos/fotos/");
    

    // Lista os arquivos na forma de array()
    $arquivos = ftp_nlist($ftp, ".");
    
    
    ftp_close( $ftp ); // Fecha a conexão com o FTP


    return $arquivos;


}

We still have the function ftp_rawlist to list files on FTP in detail, displaying permissions, dates, etc.

Example:

$saida = ftp_rawlist($ftp, '/');
var_dump($saida);

The example above will display something like this:

array(3) {
  [0]=>
  string(65) "drwxr-x---   3 vincent  vincent      4096 Jul 12 12:16 public_ftp"
  [1]=>
  string(66) "drwxr-x---  15 vincent  vincent      4096 Nov  3 21:31 public_html"
  [2]=>
  string(73) "lrwxrwxrwx   1 vincent  vincent        11 Jul 12 12:16 www -> public_html"
}

And that's it! Until next time, everyone!