TipClientFtp causa possível bloqueio no servidor FTP!

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Ceb
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 16 Set 2015 09:55
Localização: Alegre/ES

TipClientFtp causa possível bloqueio no servidor FTP!

Mensagem 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
Editado pela última vez por Toledo em 08 Fev 2016 08:10, em um total de 1 vez.
Razão: O presente tópico foi movido da seção CA-Clipper, uma vez que seu conteúdo não tem relação com os objetivos daquela seção, onde só podem constar dúvidas técnicas de programação diretamente relacionadas com o Clipper.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TipClientFtp causa possível bloqueio no servidor FTP!

Mensagem por JoséQuintas »

Não sei o que pode ser, mas com certeza isso não é Clipper, está no lugar errado.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Ceb
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 16 Set 2015 09:55
Localização: Alegre/ES

[RESOLVIDO]TipClientFtp causa possível bloqueio no servidor

Mensagem 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
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

TipClientFtp causa possível bloqueio no servidor FTP!

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Ceb
Usuário Nível 1
Usuário Nível 1
Mensagens: 14
Registrado em: 16 Set 2015 09:55
Localização: Alegre/ES

Mensagem 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
Responder