Página 1 de 1

TipClientFtp causa possível bloqueio no servidor FTP!

Enviado: 06 Fev 2016 10:59
por Ceb
Bom dia!

Tenho um Aplicativo (xHarbour 1.2.1) que faz Upload de pedido e Download do retorno em formato texto. Estou fazendo conexão para duas distribuidoras através da I2 Sofware ltda (i2.com.br), porém, uma delas causa um tipo de bloqueio, e o retorno mesmo sendo gerado pela distribuidora destino não cai na área para download. Então, na pausa programada de 10s entre uma tentativa e outra para pegar o retorno, eu conecto pelo ftp.exe do Windows, entro na pasta, dou "dir" e em seguida "quit", e só então meu Aplicativo consegue baixá-lo e processá-lo!

Já entrei em contato com a Distribuidora várias vezes e não consegui chegar a uma solução, mesmo citando que a outra distribuidora que também usa a i2 funciona perfeitamente. Pretendo também entrar em contato com a i2, porém, não sei se conseguirei ser atendido, uma vez que a relação deles é com as Distribuidoras.

Daí, venho aqui mais uma vez solicitar uma orientação de alguém que passou pela situação descrita acima e/ou tenha alguma dica que possa ajudar a solucioná-la.

Obs: Acredito que talvez falte um comando para "Atualizar" após estar conectado, mas não encontrei!

Código: Selecionar todos

FUNCTION FTP_DOWNLOAD(FTPSERVER, FTPPORTA, FTPUSER, FTPPASS, FTPDIR, ARQFTP, ARQLOCAL, FTPDEL)
Local cUrl, oUrl, oFTP
cUrl := "ftp://" + FTPUSER + ":" + FTPPASS + "@" + FTPSERVER
oUrl               := tUrl():New( cUrl )
oFTP               := tIPClientFtp():New( oUrl, .F. )
oFTP:nConnTimeout  := 20000
oFTP:bUsePasv      := .T.
oFTP:nDefaultPort  := FTPPORTA
oFTP:oUrl:cUserID  := FTPUSER
oFTP:oUrl:cServer  := FTPSERVER
oFTP:oUrl:cPassword:= FTPPASS
IF oFTP:Open( cUrl )
  aLista:=oFTP:ListFiles('/'+FTPDIR+'/'+ARQFTP)
   IF LEN(aLISTA) > 0 //TEM ARQUIVO NO SERVIDOR FTP 
    oFtp:exGauge := ( @FtpProgress() )
    IF oFTP:DownLoadFile(ARQLOCAL,'/'+FTPDIR+'/'+ARQFTP) 
      IF FTPDEL //SE PEDIU PARA BAIXAR E APAGAR O ARQUIVO
       DO WHILE .T.
        IF oFTP:DELE('/'+FTPDIR+'/'+ARQFTP) ; EXIT ; ELSE ; LOOP ; ENDIF
       ENDDO
      ENDIF
     oFTP:Close() ; RETURN(.T.)
    ELSE
     oFTP:Close() ; RETURN(.F.)  
    ENDIF
   ELSE
    oFTP:Close() ; RETURN(.F.)  
   ENDIF
 Millisec(1000)
 oFTP:Close()
ELSE
  RETURN(.F.)
ENDIF
RETURN(.T.)
//
FUNCTION FTP_UPLOAD(  FTPSERVER, FTPPORTA, FTPUSER, FTPPASS, FTPDIR, ARQFTP, ARQLOCAL )
Local cUrl, oUrl, oFTP
cUrl := "ftp://" + FTPUSER + ":" + FTPPASS + "@" + FTPSERVER
oUrl               := tUrl():New( cUrl )
oFTP               := tIPClientFtp():New( oUrl, .t. )
oFTP:nConnTimeout  := 20000
oFTP:bUsePasv      := .T.
oFTP:nDefaultPort  := FTPPORTA   
oFTP:oUrl:cUserID  := FTPUSER
oFTP:oUrl:cServer  := FTPSERVER
oFTP:oUrl:cPassword:= FTPPASS
IF oFTP:Open( cUrl )
   oFtp:exGauge := ( @FtpProgress() )
   IF oFtp:UploadFile(ARQLOCAL,'/'+FTPDIR+'/'+ARQFTP)
    oFTP:Close() ; RETURN(.T.)
   ELSE
    oFTP:Close() ; RETURN(.F.)  
   ENDIF
 Millisec(1000)
 oFTP:Close()  
ELSE
   RETURN(.F.)
ENDIF
RETURN(.T.)
//
FUNCTION FtpProgress( nSent, nTotal, oFtp )
LOCAL cProgress
LOCAL nRow := Row(), nCol := Col()
cProgress:= STR((nSent/nTotal)*100,4)+"%"
@ nRow,nCol-5 say cProgress
SetPos( MaxRow()-1, 0 )
SetPos( nRow, nCol )
RETURN .T.
//
Att,

Ceb

TipClientFtp causa possível bloqueio no servidor FTP!

Enviado: 06 Fev 2016 20:16
por JoséQuintas
Não sei o que pode ser, mas com certeza isso não é Clipper, está no lugar errado.

[RESOLVIDO]TipClientFtp causa possível bloqueio no servidor

Enviado: 07 Fev 2016 13:45
por Ceb
Boa tarde!

JoséQuintas, obrigado por me avisar quanto a mensagem estar no local errado! Já fiz a notificação solicitando que a mesma seja movido para o local mais apropriado.

Quanto ao problema, consegui resolver: na função que faz o Download, inseri os seguintes comandos logo abaixo do IF oFTP:Open( cUrl ), ficando da seguinte maneira:

oFTP:CWD('..') ; oFTP:Cwd( FTPDIR ) ; oFTP:Pwd()

Ficando o resto da função como postado anteriormente.

Muito obrigado a todos!

Att,

Ceb

TipClientFtp causa possível bloqueio no servidor FTP!

Enviado: 07 Fev 2016 15:21
por JoséQuintas
Apesar que deve saber, mas em todo caso:
O cwd é pra trocar a pasta em uso, o diretório, igual DOS ou Windows.
Então uma opção seria usar o full path.

Código: Selecionar todos

cd ..
cd pasta

Código: Selecionar todos

cd \pasta
Só comentário:
Seria difícil alguém ajudar nisso, já que o problema era a pasta aonde o arquivo ficava, e não dava pra ninguém saber o lugar correto.... rs

Enviado: 07 Fev 2016 22:08
por Ceb
JoséQuintas, boa noite e obrigado novamente por sua colaboração!

Em resposta ao seu comentário: "Seria difícil alguém ajudar nisso, já que o problema era a pasta aonde o arquivo ficava, e não dava pra ninguém saber o lugar correto.... rs" Permita-me discordar em parte, pois o problema acredito que não era onde ficava a pasta, pois se observar a função inicial que postei, ela recebe o nome da pasta que eu quero e monta/lista o arquivo assim: aLista:=oFTP:ListFiles('/'+FTPDIR+'/'+ARQFTP), ou seja, pega a partir da raiz, não sendo necessário trocar pasta, devido a '/' no início e também porque é uma nova conexão e assim, acho que ela teria que cair na raiz.

Outra coisa interessante é que já utilizo esta mesma função para baixar atualizações e também fazer o mesmo procedimento para download de retornos de pedidos e ela funciona perfeitamente, somente para esta distribuidora que tive que adicionar: oFTP:CWD('..') ; oFTP:Cwd( FTPDIR ) ; oFTP:Pwd(), ficando a função conforme abaixo.

Código: Selecionar todos

FUNCTION FTP_DOWNLOAD(FTPSERVER, FTPPORTA, FTPUSER, FTPPASS, FTPDIR, ARQFTP, ARQLOCAL, FTPDEL)
Local cUrl, oUrl, oFTP
cUrl := "ftp://" + FTPUSER + ":" + FTPPASS + "@" + FTPSERVER
oUrl               := tUrl():New( cUrl )
oFTP               := tIPClientFtp():New( oUrl, .F. ) //t cria log
oFTP:nConnTimeout  := 20000
oFTP:bUsePasv      := .T.
oFTP:nDefaultPort  := FTPPORTA
oFTP:oUrl:cUserID  := FTPUSER
oFTP:oUrl:cServer  := FTPSERVER
oFTP:oUrl:cPassword:= FTPPASS
IF oFTP:Open( cUrl )
   oFTP:CWD('..') ; oFTP:Cwd( FTPDIR ) ;  oFTP:Pwd()
  aLista:=oFTP:ListFiles('/'+FTPDIR+'/'+ARQFTP)
   IF LEN(aLISTA) > 0 //TEM O ARQUIVO NO SERVIDOR FTP 
    oFtp:exGauge := ( @FtpProgress() )
    IF oFTP:DownLoadFile(ARQLOCAL,'/'+FTPDIR+'/'+ARQFTP) 
      IF FTPDEL //SE PEDIU PARA BAIXAR E APAGAR O ARQUIVO
       DO WHILE .T.
        IF oFTP:DELE('/'+FTPDIR+'/'+ARQFTP) ; EXIT ; ELSE ; LOOP ; ENDIF
       ENDDO
      ENDIF
     oFTP:Close() ; RETURN(.T.)
    ELSE
     oFTP:Close() ; RETURN(.F.)  
    ENDIF
   ELSE
    oFTP:Close() ; RETURN(.F.)  
   ENDIF
 Millisec(1000)
 oFTP:Close()
ELSE
  RETURN(.F.)
ENDIF
RETURN(.T.)
O mais interessante, era que meu programa ficava rodando e não achava o retorno. Sem fechá-lo, eu chamava o ftp.exe do windows, conectava, entrava na pasta, voltava para a raiz e saia em seguida, então meu programa que estava tentando pegar a resposta e não conseguia, agora consegue? Obs: mesmo se eu fechasse meu programa e o executasse novamente ele ainda assim não conseguia, somente após executar o ftp.exe!

No mais, muito obrigado!

Ceb