Página 1 de 2

Problema com tipclientftp

Enviado: 02 Ago 2014 00:01
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?

Problema com tipclientftp

Enviado: 05 Ago 2014 11:20
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.

Problema com tipclientftp

Enviado: 05 Ago 2014 12:07
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.

Problema com tipclientftp

Enviado: 05 Ago 2014 18:29
por JoséQuintas

Código: Selecionar todos

      oFtp:DownloadFile( cTarget, cSource )

Problema com tipclientftp

Enviado: 05 Ago 2014 23:33
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).

Problema com tipclientftp

Enviado: 06 Ago 2014 11:36
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 )

Problema com tipclientftp

Enviado: 06 Ago 2014 17:10
por cjp
Então era pra funcionar do jeito que estou fazendo, correto?

Problema com tipclientftp

Enviado: 06 Ago 2014 19:49
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.

Problema com tipclientftp

Enviado: 07 Ago 2014 00:36
por cjp
Isso eu já verifiquei, o nome do arquivo está todo em minúsculas.

Problema com tipclientftp

Enviado: 09 Ago 2014 23:28
por sygecom
Inacio,
Como o José falou, está faltando colocar o destinho onde deve salvar o arquivo baixado.

Problema com tipclientftp

Enviado: 09 Ago 2014 23:48
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")
.

Problema com tipclientftp

Enviado: 09 Ago 2014 23:59
por sygecom
Inacio, tem que passar o caminho completo do arquivo, exemplo:

Código: Selecionar todos

if !oFtp:DownLoadFile(arqvpeg,"c:\aulas\arquivo.doc")

Problema com tipclientftp

Enviado: 10 Ago 2014 00:11
por cjp
Assim:

Código: Selecionar todos

if !oFtp:DownLoadFile(arqvpeg,"c:\aulas\"+arqvpeg
Também não funcionou, retornou .f.

Problema com tipclientftp

Enviado: 10 Ago 2014 11:48
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.

Problema com tipclientftp

Enviado: 15 Ago 2014 21:00
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?