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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Problema com tipclientftp

Mensagem por JoséQuintas »

Código: Selecionar todos

      oFtp:DownloadFile( cTarget, cSource )
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 20420
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

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, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (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: 7135
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: 7135
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: 2822
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP
Curtiu: 2 vezes

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