Problema com tipclientftp

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

Moderador: Moderadores

cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Pessoal, por favor, vocês vêem algo errado nesta função:

Código: Selecionar todos

Function pegaftp(arqvpeg,pasta)
    local ntentativa :=0
	ftpproto ="ftp://" //posthilit">ftp://"
	ftpserver = ftps //posthilit">ftp.servidor.com.br"  endereço de ="posthilit">FTP</span> do site
	ftpuser = usftp   //Usuário da conta ="posthilit">FTP</span>
	ftppass = snhftp    //Senha da conta ="posthilit">FTP</span>
	curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver
	oCred:= tIPCredentials()
	oUrl:= turl():new(curl)
	oFtp:= tipclientftp():NEW(oUrl,.F.)
	oFTP:nConnTimeout := 20000
	oFTP:bUsePasv     := .T.
	@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
	@ maxrow()-1,1 say "Abrindo conexão..."
	do while .t.
	   IF oFTP:Open()=.t.
	      exit
	   else
	      @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
		  @ maxrow()-1,1 say "Não abriu o FTP; tentando novamente ("+alltrim(str(nTentativa))+")"
	      nTentativa++
		  inkey(5)
		  if nTentativa>10
		     return .f.
	      endif
	   endif
	enddo
	@ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
	@ maxrow()-1,1 say "Fazendo download do arquivo "+arqvpeg
	   oFTP:Cwd(pasta)  
	      if !oFtp:DownLoadFile(arqvpeg)  //informe o nome do arquivo que você quer baixar
			 return .f.
	     endif
	   oFTP:Close()
	   @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
	   @ maxrow()-1,1 say "Arquivo "+arqvpeg+" baixado com sucesso"
	   inkey(3)
Return .t.
Não sei porque, ele informa que o arquivo foi baixado, mas não baixa.

Alguém saberia me dizer por que?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com tipclientftp

Mensagem por JoséQuintas »

O que significa "informa que o arquivo foi baixado", e como identifica que o arquivo não foi baixado?

Olhando o fonte, não consegui identificar o nome do arquivo local.

Provavelmente falta salvar o download em disco.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Quis dizer que ele vai até o fim da função sem dar erro, ou seja, a função oFtp:DownLoadFile(arqvpeg) retorna .t., como se o arquivo tivesse sido baixado.

O arquivo não foi baixado, pois ele não se encontra no disco local.

O nome do arquivo a ser baixado está no conteúdo da variável arqvpeg.

Como assim salvar o download? Ao baixar, ele já não salva automaticamente no disco?

Eu tenho uma outra função muito semelhante a esta, que funciona perfeitamente. A única diferença é que esta outra apaga o arquivo do FTP, coisa que esta não faz. Veja:

Código: Selecionar todos

Function recebftp(arqvrec,pasta)
	ftpproto ="ftp://" //posthilit">ftp://"
	ftpserver = ftps //posthilit">ftp.servidor.com.br"  endereço de ="posthilit">FTP</span> do site
	ftpuser = usftp   //Usuário da conta ="posthilit">FTP</span>
	ftppass = snhftp    //Senha da conta ="posthilit">FTP</span>
	curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver
	oUrl:= turl():new(curl)
	oCred:= tIPCredentials()
	oFtp:= tipclientftp():NEW(oUrl,,.T.)
	oFTP:nConnTimeout := 20000
	oFTP:bUsePasv     := .T.
	pasta=alltrim(pasta)
	nTentativa=0
	do while .t.
	   IF oFTP:Open()=.t.
	      exit
	   else
	      @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
		  @ maxrow()-1,1 say "Não abriu o FTP; tentando novamente ("+alltrim(str(nTentativa))+")"
	      nTentativa++
		  inkey(5)
		  if nTentativa>8
	         erecftp="nao conectou"
		     return .f.
	      endif
	   endif
	enddo
	nTentativa=0
	do while .t.
	   oFTP:Cwd( "" )
	   if oFTP:Cwd(pasta)=.t.	// informe o diretorio (="posthilit">no</span> site) onde está o arquivo EXE que voce vai copiar
	      exit
	   else
	      @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
		  @ maxrow()-1,1 say "Não abriu a pasta no FTP; tentando novamente ("+alltrim(str(nTentativa))+")"
	      nTentativa++
		  inkey(3)
		  if nTentativa>7
	         erecftp="pasta "+pasta+" não foi aberta"
	         return .f.
		  endif
	   endif
	enddo
	nTentativa=0
	do while .t.
	   if oFtp:DownLoadFile(arqvrec)=.t.  //informe o nome do arquivo que você quer baixar
	      exit
	   else
	      if "atemp"$arqvrec
		     return .t.
		  endif
		  @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
	      @ maxrow()-1,1 say "Não recebeu o arquivo "+arqvrec+"; tentando baixar novamente"
	      nTentativa++
		  inkey(5)
		  sele 4
		  if conexsql()
             DBUSEAREA( .T.,, "SELECT * FROM tarefas WHERE usuario='"+us+"'", "recebftp")
		     locate for data=date() .and. val(substr(hora,1,2))=val(substr(time(),1,2)) .and. acao="Recebim" .and. nrtarefa=arqvrec
			 if found()
			    return .t.
			 endif
		  endif
		  use
		  sele 1
		  if us="I" .and. nTentativa>2
			 tone(261.7,nTentativa)
		  endif
		  if nTentativa>8
	         erecftp="não recebeu arquivo"
	         return .f.
	      endif
	   endif
	enddo
	nTentativa=0
	do while .t.
	   if oFtp:DELE(arqvrec)=.t.
	      exit
	   else
		  @ maxrow()-1,1 clear to maxrow()-1,maxcol()-1
		  @ maxrow()-1,1 say "Não apagou o arquivo "+arqvrec+" do FTP; tentando novamente ("+alltrim(str(nTentativa))+")"
	      nTentativa++
		  inkey(3)
		  if nTentativa>7
	         erase exclui.log
	         if verarqv("exclui.bat")=.t.
                __run("exclui " + ftps + " " + usftp + " " + snhftp + " " + pasta + " . " + arqvrec)
                cexcl:=ALLTRIM(MEMOREAD("C:\tarefas\exclui.log"))
	            if at("DELE command successful",cexcl)=0
                   if us="I"
                      ?"Erro COMUNS 385 - não apaga o arquivo recebido"
                      tone(261.7,33)
                      inkey(10)
		           else	 
                      if mandmail1("copp.txt","Não conseguiu excluir arquivo "+arqvrec+ " (COMUNS 386)")=.f.
                         ?"Avisar ao Dr. Inacio que não está apagando o arquivo do FTP"
	                     tone(261.7,33)
                      endif   
			       endif	
		        endif	 
			 else
			    mandmail1("","Não tem o arquivo exclui.bat")
	         endif	  
			 exit
	      endif
	   endif
	enddo
	oFTP:Close()
Return .t.
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com tipclientftp

Mensagem por JoséQuintas »

Código: Selecionar todos

      oFtp:DownloadFile( cTarget, cSource )
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Se eu entendi tua mensagem, Quintas, vc está dizendo que a sintaxe da oFtp:DownLoadFile que eu estou usando está errada? Mas na outra função eu uso exatamente a mesma sintaxe e funciona. Aliás, eu peguei essa sintaxe neste post: https://pctoledo.org/forum/viewto ... 7&start=15.

Vc poderia, por favor, me explicar melhor a sintaxe? cTarget é a pasta no ftp? Mas a ausência deste parâmetro não permitiria baixar da pasta corrente? É que, antes de baixar, eu mudo a pasta corrente com oFTP:Cwd(pasta).
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com tipclientftp

Mensagem por JoséQuintas »

target = destino
source = origem

é o nome de onde vém e pra onde vai.
Sempre usei assim.

Olhando o fonte do Harbour 3.2, ftpcli.prg, tem esta anotação:

Código: Selecionar todos

   2007-07-12, miguelangel@marchuet.net
   Added method :NoOp()
   Added method :Rest( nPos )
   Changed method :LS( cSpec )
   Changed method :List( cSpec )
   Changed method :TransferStart()
   Changed method :Stor( cFile )
   Changed method :UploadFile( cLocalFile, cRemoteFile )
   Changed method :DownloadFile( cLocalFile, cRemoteFile )
E o fonte do método assume um default quando não indicado:

Código: Selecionar todos

METHOD DownLoadFile( cLocalFile, cRemoteFile ) CLASS TIPClientFTP
   LOCAL cPath
   LOCAL cFile
   LOCAL cExt
   hb_FNameSplit( cLocalFile, @cPath, @cFile, @cExt  )
   hb_default( @cRemoteFile, cFile + cExt )
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Então era pra funcionar do jeito que estou fazendo, correto?
Inacio de Carvalho Neto
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Problema com tipclientftp

Mensagem por JoséQuintas »

Pelo que vi, se o nome do arquivo não contiver nenhuma referência a drive, diretório ou url sim.
Acho que vai baixar no diretório atual do aplicativo.

Tem mais outra coisa a verificar:
O ftp pode ser case sensitive, exigir exatamente as mesmas maiúsculas/minúsculas para o nome do arquivo.
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/
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Isso eu já verifiquei, o nome do arquivo está todo em minúsculas.
Inacio de Carvalho Neto
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Problema com tipclientftp

Mensagem por sygecom »

Inacio,
Como o José falou, está faltando colocar o destinho onde deve salvar o arquivo baixado.
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Seria assim:

Código: Selecionar todos

if !oFtp:DownLoadFile(arqvpeg,"c:\aulas")
Assim também não funcionou.

Mas ao menos agora está retornando .f. Só que o arquivo existe no FTP da forma como o programa está sendo chamado:

Código: Selecionar todos

pegaftp("arqbx.dbf",ptftp+"meusarq/tarefas")
.
Inacio de Carvalho Neto
Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Problema com tipclientftp

Mensagem por sygecom »

Inacio, tem que passar o caminho completo do arquivo, exemplo:

Código: Selecionar todos

if !oFtp:DownLoadFile(arqvpeg,"c:\aulas\arquivo.doc")
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Assim:

Código: Selecionar todos

if !oFtp:DownLoadFile(arqvpeg,"c:\aulas\"+arqvpeg
Também não funcionou, retornou .f.
Inacio de Carvalho Neto
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Problema com tipclientftp

Mensagem por Jairo Maia »

Olá Inácio,

Quando li sua função postado no primeiro post, não vi nada errado com ela, mesmo os colegas indicando para colocar o endereço destino, você tem razão quando diz que se o destino é omitido o arquivo é salvo na pasta corrente. Isto é correto.

No entanto, a única sugestão que eu daria em alteração a sua função seria colocar antes da linha: oFTP:Cwd(pasta) o seguinte:

Código: Selecionar todos

oFTP:Cwd(".")        // se posiciona na pasta raiz
oFTP:Cwd(pasta)    // se posiciona na pasta desejada.
Mas não tenho certeza se pode ser isso. Se ainda não funcionar, poste o conteúdo da variável pasta para tentarmos entender se isso tem a ver também.
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Problema com tipclientftp

Mensagem por cjp »

Isso também não funcionou, Jairo. Continua retornando falso no if oFtp:DownLoadFile(arqvrec)=.t.

Será que não existe um log ou alguma forma de debugar para saber onde está o problema?
Inacio de Carvalho Neto
Responder