Hoje vou falar um pouco sobre as funções para manipulação (no PHP) do protocolo FTP, que permite o envio de arquivos entre servidores.
Falarei sobre quatro cinco tarefas básicas: abrir a conexão, fazer o login, enviar um arquivo, receber um arquivo e desconectar o FTP.
Faremos um arquivo que conterá todas essas tarefas, então vai ficar fácil entender como tudo funciona.
> Conectando-se ao FTP
Para se conectar a um servidor FTP você deve usar a função ftp_connect(), que tem três possíveis argumentos:
- O servidor ao qual estamos tentando conexão (geralmente um ip ou domínio)
- A porta por onde será tentada a conexão, por padrão o PHP já usa a porta 21. (opcional)
- O timeout, que é o tempo máximo para tentar a conexão (opcional)
Então, começaremos o nosso arquivo:
< ?php /** * Conexão via FTP com o PHP * 05 de maio de 2009 * Thiago Belem ~ http://blog.thiagobelem.net/ */ // Dados do servidor $servidor = 'thiagobelem.net'; // Endereço // Abre a conexão com o servidor FTP $ftp = ftp_connect($servidor); // Retorno: true ou false ?>
Até aqui, nada de misterioso… Vamos continuar.
» Veja também: Documentação da função ftp_connect()
> Fazendo login no FTP
Para fazer o login você vai usar a função ftp_login(), que tem três argumentos obrigatórios:
- O identificador da conexão, definido no uso do ftp_connect()
- Usuário
- Senha
Então, fazendo algumas alterações no nosso arquivo:
< ?php /** * Conexão via FTP com o PHP * 05 de maio de 2009 * Thiago Belem ~ http://blog.thiagobelem.net/ */ // Dados do servidor $servidor = 'thiagobelem.net'; // Endereço $usuario = 'usuario'; // Usuário $senha = 'senha'; // Senha // Abre a conexão com o servidor FTP $ftp = ftp_connect($servidor); // Retorno: true ou false // Faz o login no servidor FTP $login = ftp_login($ftp, $usuario, $senha); // Retorno: true ou false ?>
Vale lembrar que não estou criando nenhuma rotina de debug ou de manipulação de erros, estou partindo da premissa que os dados estão corretos e o servidor FTP está rodando, no ar.
A partir deste ponto já estamos conectados e logados no servidor FTP e podemos começar a pegar e enviar arquivos.
» Veja também: Documentação da função ftp_login()
> Enviando arquivos para o FTP (upload)
Para fazer upload de arquivos você vai usar a função ftp_put(), que tem quatro argumentos obrigatórios:
- O identificador da conexão, definido no uso do ftp_connect()
- Onde e com qual nome o arquivo será salvo no FTP
- O arquivo que será enviado (local)
- O modo de envio, pode ser FTP_ASCII ou FTP_BINARY
Então, fazendo algumas alterações no nosso arquivo:
< ?php /** * Conexão via FTP com o PHP * 05 de maio de 2009 * Thiago Belem ~ http://blog.thiagobelem.net/ */ // Dados do servidor $servidor = 'thiagobelem.net'; // Endereço $usuario = 'usuario'; // Usuário $senha = 'senha'; // Senha // Abre a conexão com o servidor FTP $ftp = ftp_connect($servidor); // Retorno: true ou false // Faz o login no servidor FTP $login = ftp_login($ftp, $usuario, $senha); // Retorno: true ou false // Define variáveis para o envio de arquivo $local_arquivo = './arquivos/documento.doc'; // Localização (local) $ftp_pasta = '/public_html/arquivos/'; // Pasta (externa) $ftp_arquivo = 'documento.doc'; // Nome do arquivo (externo) // Envia o arquivo pelo FTP em modo ASCII $envio = ftp_put($ftp, $ftp_pasta.$ftp_arquivo, $local_arquivo, FTP_ASCII); // Retorno: true / false ?>
Com isso você já vai poder conectar-se a um FTP e enviar arquivos dinamicamente, o que é muito útil.
» Veja também: Documentação da função ftp_put()
> Recebendo arquivos pelo FTP (download)
Para fazer download de arquivos você vai usar a função ftp_get(), que tem quatro argumentos obrigatórios, os mesmos do ftp_put():
- O identificador da conexão, definido no uso do ftp_connect()
- Onde e com qual nome o arquivo está salvo no FTP
- Onde o arquivo que será salvo (local)
- O modo de envio, pode ser FTP_ASCII ou FTP_BINARY
Então, fazendo algumas alterações no nosso arquivo:
< ?php /** * Conexão via FTP com o PHP * 05 de maio de 2009 * Thiago Belem ~ http://blog.thiagobelem.net/ */ // Dados do servidor $servidor = 'thiagobelem.net'; // Endereço $usuario = 'usuario'; // Usuário $senha = 'senha'; // Senha // Abre a conexão com o servidor FTP $ftp = ftp_connect($servidor); // Retorno: true ou false // Faz o login no servidor FTP $login = ftp_login($ftp, $usuario, $senha); // Retorno: true ou false // ====== // Define variáveis para o envio de arquivo $local_arquivo = './arquivos/documento.doc'; // Localização (local) $ftp_pasta = '/public_html/arquivos/'; // Pasta (externa) $ftp_arquivo = 'documento.doc'; // Nome do arquivo (externo) // Envia o arquivo pelo FTP em modo ASCII $envia = ftp_put($ftp, $ftp_pasta.$ftp_arquivo, $local_arquivo, FTP_ASCII); // Retorno: true / false // ====== // Define variáveis para o recebimento de arquivo $local_arquivo = './arquivos/planilha.xls'; // Localização (local) $ftp_pasta = '/public_html/arquivos/'; // Pasta (externa) $ftp_arquivo = 'planilha.xls'; // Nome do arquivo (externo) // Recebe o arquivo pelo FTP em modo ASCII $recebe = ftp_get($ftp, $ftp_pasta.$ftp_arquivo, $local_arquivo, FTP_ASCII); // Retorno: true / false ?>
» Veja também: Documentação da função ftp_get()
> Desconectando-se do FTP
Para se desconectar (faça isso, sempre) você vai usar a função ftp_close(), que tem apenas um argumento: o identificador da conexão.
Então, finalizando o no nosso arquivo:
< ?php /** * Conexão via FTP com o PHP * 05 de maio de 2009 * Thiago Belem ~ http://blog.thiagobelem.net/ */ // Dados do servidor $servidor = 'thiagobelem.net'; // Endereço $usuario = 'usuario'; // Usuário $senha = 'senha'; // Senha // Abre a conexão com o servidor FTP $ftp = ftp_connect($servidor); // Retorno: true ou false // Faz o login no servidor FTP $login = ftp_login($ftp, $usuario, $senha); // Retorno: true ou false // ====== // Define variáveis para o envio de arquivo $local_arquivo = './arquivos/documento.doc'; // Localização (local) $ftp_pasta = '/public_html/arquivos/'; // Pasta (externa) $ftp_arquivo = 'documento.doc'; // Nome do arquivo (externo) // Envia o arquivo pelo FTP em modo ASCII $envia = ftp_put($ftp, $ftp_pasta.$ftp_arquivo, $local_arquivo, FTP_ASCII); // Retorno: true / false // ====== // Define variáveis para o recebimento de arquivo $local_arquivo = './arquivos/planilha.xls'; // Localização (local) $ftp_pasta = '/public_html/arquivos/'; // Pasta (externa) $ftp_arquivo = 'planilha.xls'; // Nome do arquivo (externo) // Recebe o arquivo pelo FTP em modo ASCII $recebe = ftp_get($ftp, $ftp_pasta.$ftp_arquivo, $local_arquivo, FTP_ASCII); // Retorno: true / false // Encerra a conexão ftp ftp_close($ftp); ?>
Com esse arquivo você tem exemplos simples de como usar as tarefas básicas de uma conexão via protocolo FTP. É claro que existem várias outras funções relacionadas ao tamanho de arquivos, CHMOD (permissões), pastas e etc… Por isso vale a pena dar uma olhada na lista de funções FTP do PHP.
» Veja também: Lista de funções FTP
Você também vai gostar de ler:
- Conexão MySQL – Servidor Local e Externo
- Como criar um Sistema de Login com Níveis de Permissão
- Criando um sistema de login com PHP e MySQL
- Enviar e-mails pelo PHP usando o PHPMailer
- Orientação a Objetos – Material Básico
Com as tags ASCII, Conexão, Debug, Documentação, Domínio, Download, Erros, Externo, FTP, Funções, HTML, Login, Manipulação, Manipulação de Erros, Pastas, PHP, Scripts, Senha, Servidor, Upload, Variáveis, XLS
Escrito por Thiago Belem
Gostou desse artigo?
Não se esqueça de assinar o RSS e divulgue-o para o mundo:

Opa e ai Thiago, eu estou desenvolvendo um FTP personalizado para a minha empresa e vi esse seu script ai, eu gostaria de saber como que eu faço para tornar isso um FTP real, tipo a pessoa acessa com um login e senha e abre o diretório correspondente ao usuário, listando todas as pastas e arquivos. Sabe como fazer isso, rodei a net inteira e não consegui encontrar.
@Matheus
Você vai precisar instalar um servidor de FTP no seu servidor…
Oi Thiago eu estava usando um outro código, o seu é bem mais simples, obrigada!
Posso tirar uma dúvida? Estou enviando arquivos txt e xml do servidor da locaweb para o servidor do yahoo, junto com imagens jpg, e é tudo públicado no formato de uma notícia. Estava tudo dando certo e de repente parou de publicar há 3 dias. Os arquivos chegam lá certinhos, mas não são publicados, acho que não é erro ftp pois senão os arquivos nem chegariam, o q vc acha? as permissões estao como 777
@Juliana
Tente permissões não tão abrangentes como 766 ou até 755.
Tem como enviar varios arquivos de uma vez? Tipo criar uma fila de envio para varios arquivos.
@Evandro
Use uma estrutura de repetição (for, while, foreach)
Bom dia Thiago, parabéns e obrigado pela sua dica agora eu consigo subir os arquivos grandes sua dica foi show de bola!!!! Valew
Boa noite tiago estou com um problema referente a fazer upload de arquivos grandes tipo de 35mb eu não consigo vc sabe me dizer como devo agir, meus códigos não funcionam, http://www.vencys.com.br/levar, sobem apenas aqvs de 8 mb pra baixo os outro não sobem.
@Anderson
Você provavelmente precisa alterar as configurações de limite de upload do seu php.. Vá no seu php.ini e procure pelas seguintes variáveis: file_uploads, upload_max_filesize, max_input_time, memory_limit, max_execution_time e post_max_size. Abraços!
Olá,
Parabens pelo post, muito legal…mas cara, estou usando o código como vc descreveu acima, mas em alguns casos da o erro “HTTP 500 – Erro interno do servidor”, será que é permissão de diretório?
Ou será por eu ser novo no PHP, dai estou apanhando para concatenar o diretório local, tipo, barra acontrario “C:\file.txt”, sendo que o correto seria “C:/file.txt”, será que é isso?
Falow cara e mais uma vez parabens pelo Blog…..
@Jesrael
Esse erro acontece ou quando a sintaxe do htaccess está incorreta, ou quando você não pode usar alguns recursos dele… Está testando localmente?
Tiago dei uma olhada no link que tu me mandou…Sou iniciante no php e por incrivel que pareça não ficou claro pra mim…Eu copiei o script mas quando eu rodei ele deu ima mensagem que o explorer “não pode baixar o arquivo”
no meu caso os arquivos estão muma pasta no servidor e preciso baixá-los.
Como eu faço…É essa a minha dúvida!
@Luiz
Veja se isso te ajuda:
http://w-shadow.com/blog/2007/08/12/how-to-force-file-download-with-php/
Gostei muito do escript que você criou!!!
Mas eu estou criando um site onde o cliente precisa baixar arquivos do
de uma determinada pasta do servidor por exemplo: public_html/teste.
Prfeciso também que quando fizer o download apareça a caixa para ele
salvar onde quiser..Se tu puder me dar uma ajuda agradeço desde já.
Uma grande abraço e até mais.
@Luiz Carlos
Veja esse artigo:
http://blog.thiagobelem.net/mysql/2009/04/04/criando-e-exportando-planilhas-do-excel-com-php-403/
No final você encontra um exemplo de script para download, é só fazer alguns ajustes no tipo e nome do arquivo.