Função que sobe um arquivo em um FTP via AdvPL

Olá pessoal…

Hoje vou mostrar como enviar um arquivo para um servidor FTP utilizando a linguagem AdvPL.

AdvPL

AdvPL

Através das funções FTPConnect e FTPUpload, fiz uma função para envio de arquivo para o FTP, abaixo o código fonte desenvolvido.

//Bibliotecas
#Include "Protheus.ch"

/*/{Protheus.doc} zFTPEnv
Função que envia um arquivo para um servidor FTP
@author Atilio
@since 28/03/2017
@version 1.0
	@param cEndereco, Caracter, Endereço do FTP
	@param nPorta, Numerico, Porta de Conexão
	@param cUsr, Caracter, Usuário
	@param cPass, Caracter, Senha
	@param cArq, Caracter, Arquivo a ser enviado (deve estar dentro da \System\)
	@return lRet, Retorno lógico se deu certo ou não o envio
/*/

User Function zFTPEnv(cEndereco, nPorta, cUsr, cPass, cArq)
	Local aArea   := GetArea()
	Local lRet    := .T.
	Local cDirAbs := GetSrvProfString("STARTPATH","")  
	cDirAbs       += "\" + cArq
	
	//Se conseguir conectar
	If FTPConnect(cEndereco ,nPorta ,cUsr , cPass )
		
		//Desativa o firewall
		FTPSetPasv(.F.)		
		
		//Se não conseguir dar o upload
		If !FTPUpload(cDirAbs, cArq)
			//Realiza mais uma tentativa
			If !FTPUpload(cDirAbs, cArq)
				lRet:=.F.
			EndIf
		EndIf
		
		//Desconecta do FTP
		FTPDisconnect()
	EndIf

	RestArea(aArea)
Return lRet

Bom pessoal, por hoje é só.
Abraços e até a próxima.

Dan Atilio (Daniel Atilio)
Especialista em Engenharia de Software pela FIB. Entusiasta de soluções Open Source. E blogueiro nas horas vagas.

9 Responses

  1. Joao Marcos Magnez Coelho disse:

    Muito bom ! me ajudou muito

  2. Francisco c Dantas disse:

    Muito Bacana!
    Obrigado Atilio.
    Abs.

  3. Francisco c Dantas disse:

    Dan Atilio,
    Estou tendo dificuldades com o TFtpClient:Directory.
    Nao carrega os arquivos da pasta. Ja tentei muitas coisas e nada.
    Você pode me ajudar dando uma dica ?

    aFiles := oFTPHandle:Directory(“*.CSV”, .T. ) //TFtpClient:Directory
    IF ( Len(aFiles) == 0 )
    cLastResp := oFTPHandle:GetLastResponse() //”500 Invalid PORT Command.”
    IF ( “500” $ cLastResp )
    //Altero para Modo Passivo
    lFireWall := oFTPHandle:bFireWallMode
    oFTPHandle:bFireWallMode := .T.
    //Tento Obter informacoes do arquivo enviado em modo CaseSensitive
    aFiles := oFTPHandle:Directory(cFTPCurDir + “/” + “*.CSV”, .T. )
    //Restaura Modo Anterior
    oFTPHandle:bFireWallMode := lFireWall
    EndIF
    EndIf

    Obrigado.

  4. Francisco c Dantas disse:

    Eu acho que é a PORTA do FTP.
    EU consigo enviara mas receber nao.
    500 Invalid PORT Command.
    Obrigado.

    • Dan_Atilio disse:

      Pode ser Francisco.
      Nesse exemplo do artigo, é usado as funções antigas, não é usado a classe TFtpClient.
      Se quiser fazer um teste, tente usar as funções FTPDownload() e FTPDirectory().

  5. Douglas da Silva disse:

    1 – Você têm que dar uma dir na raiz, exemplo:

    oFtp := tFTPClient():New()

    aFtpFile := oFtp:Directory(“*”,.T.)

    depois você têm que alterar o dir para a pasta que você quer, exemplo:

    2 – If oFtp:ChDir(“/xml/00000/2020/04/23/SAT/Extrato/”) == 0

    conout(“Muda o diretório corrente do servidor remoto com sucesso.”)

    aFtpFile := oFtp:Directory(“*”,.T.)

    else

    conout(“Erro Muda o diretório corrente do servidor remoto.”)

    endif

Deixe uma resposta