Envio FTP c/ xHarbour não salva remoto.

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

Moderador: Moderadores

Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Envio FTP c/ xHarbour não salva remoto.

Mensagem por alaminojunior »

Boa noite caros !

Peguei este exemplo de algum colega aqui no fórum.
A conexão é realizada, assim como a criação da pasta.
O método de envio do arquivo não retorna nenhum erro,
inclusive a variável oFtp:cReply (resposta) volta dizendo que a transferência obteve sucesso.

Porém, quando verifico a existência do arquivo no servidor FTP, o mesmo não está lá. :%

Alguém por favor pode analisar este código e me dizer o que falta ?

Código: Selecionar todos

#include "fileio.ch"
#include "common.ch"
#include "Directry.ch"
#define eFTPSERVER1 'daxxi.com.br'    
#define eFTPPORTA 21                  
#define eFTPUSER  'daxxi'             
#define eFTPPASS  'password'         

function enviaftp()
setmode(80,80)
   arqv := 'update.prg' 
   pasta := 'NFP'       
   aDir0 := directory(arqv)
   IF UPLOAD_ARQ( alltrim(pasta), alltrim(arqv) ) = .F.
      @ maxrow(),1 say "Arquivo não enviado"
      tone(261.7,23)
      inkey(10)
      return .f.
   else
      return .t.
   ENDIF
   RETURN NIL

STATIC FUNCTION UPLOAD_ARQ( FTPDIR, farq )
   Local cUrl, oUrl, oFTP, cFTPSERVER:=''
   cFTPSERVER:=eFTPSERVER1  
   cUrl := "ftp://" + eFTPUSER + ":" + eFTPPASS + "@" + cFTPSERVER
   oUrl       := tUrl():New( cUrl )
   oFTP       := tIPClientFtp():New( oUrl, .T. )
   oFTP:nConnTimeout := 20000
   oFTP:bUsePasv  := .T.
   oFTP:nDefaultPort := eFTPPORTA
   oFTP:oUrl:cUserID := eFTPUSER
   oFTP:oUrl:cServer := cFTPSERVER
   oFTP:oUrl:cPassword := eFTPPASS
   IF oFTP:Open( cUrl )
	   alista:= oFTP:ListFiles()   
	   cRoot:= aLista[1,1]
	   IF !oFTP:Cwd(cRoot + '/' + ftpdir)  // se não achar o diretorio ele cria
	       oFTP:Mkd(cRoot + '/' + ftpdir)  // cria o diretorio
	   ENDIF                                                    	
      oFTP:reset()= .f.
	
	   if oFtp:UploadFile( farq, farq ) = .f.  
         @ maxrow(),1 say "Não é possível enviar o arquivo"
         return .f.
	   endif
		alert(oFTP:cReply) 
	   oFTP:CWD( ".." ) 
	   oFTP:Close()
   ENDIF
RETURN( .T.)
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Envio FTP c/ xHarbour não salva remoto.

Mensagem por Jairo Maia »

Olá alaminojunior,

É porque você não está se posicionando na pasta NFP no servidor. Acrescente depois da linha 41 do seu código, a seguinte linha:

Código: Selecionar todos

oFTP:CWD( cRoot + '/' + ftpdir )
PS: Não entendi essa linha:

Código: Selecionar todos

oFTP:reset()= .f.
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)
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Envio FTP c/ xHarbour não salva remoto.

Mensagem por alaminojunior »

Jairo, obrigado pela atenção !

Código: Selecionar todos

IF !oFTP:Cwd(cRoot + '/' + ftpdir)  // se não achar o diretorio ele cria
    oFTP:Mkd(cRoot + '/' + ftpdir)  // cria o diretorio
ENDIF  
Eu imaginei que a primeira chamada ao método oFTP:Cwd(cRoot + '/' + ftpdir) já trocasse o diretório de trabalho.
Mesmo assim, coloquei uma segunda chamada conforme orientação sua, e ainda assim o arquivo não é gravado na pasta, apesar do retorno ser de 'transferência completada'
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Envio FTP c/ xHarbour não salva remoto.

Mensagem por Jairo Maia »

Olá alaminojunior,

Verdade. A rigor ela precisa apenas ser colocada se a pasta for criada, se ela existir já está sendo posicionada antes:

Código: Selecionar todos

IF !oFTP:Cwd(cRoot + '/' + ftpdir)  // se não achar o diretorio ele cria
    oFTP:Mkd(cRoot + '/' + ftpdir)  // cria o diretorio
    oFTP:Cwd(cRoot + '/' + ftpdir)  // posiciona na nova pasta
ENDIF
Acabei de compilar seu exemplo com meus dados e criou a pasta NFP e subiu o arquivo "exemplo.prg" (que coloquei para subir). Meu servidor é Linux, funcionou. Verifique na pasta raiz de seu servidor se o arquivo que você está subindo está lá. Se seu servidor for windows, sei que é um pouco mais chato pra usar ftp.
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)
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

Envio FTP c/ xHarbour não salva remoto.

Mensagem por alaminojunior »

Boa tarde !

Jairo, após alguns ajustes conseguí êxito usando o seguinte código:

Código: Selecionar todos

   arqv := 'update.exe'
   nTAMANHO:=0
   aDir0 := directory('update.exe')
   nTAMANHO:= aDir0[1,2]	 
   pasta := 'NFP'       
   aDir0 := directory(arqv)
   IF UPLOAD_ARQ( alltrim(pasta), alltrim(arqv), nTAMANHO ) = .F.
      @ maxrow(),1 say "Arquivo não enviado"
      tone(261.7,23)
      inkey(10)
      return .f.
   else
      return .t.
   ENDIF
   RETURN NIL

STATIC FUNCTION UPLOAD_ARQ( FTPDIR, farq, cTamanho )
   Local cUrl, oUrl, oFTP, cFTPSERVER:=''
   cFTPSERVER:=eFTPSERVER1  
   cUrl := "ftp://" + eFTPUSER + ":" + eFTPPASS + "@" + cFTPSERVER
   oUrl       := TUrl():New( cUrl )
   oFTP       := TIPClientFtp():New( oUrl, .T. )
   oFTP:nConnTimeout := 20000
   oFTP:bUsePasv  := .T.
   oFTP:nDefaultPort := eFTPPORTA
   oFTP:oUrl:cUserID := eFTPUSER
   oFTP:oUrl:cServer := cFTPSERVER
   oFTP:oUrl:cPassword := eFTPPASS
   IF oFTP:Open( cUrl )
	   cRoot:= 'www'
	   IF !oFTP:Cwd(cRoot + '/' + ftpdir)  // se não achar o diretorio ele cria
	       oFTP:Mkd(cRoot + '/' + ftpdir)  // cria o diretorio
	   ENDIF                                                    	
	   oFTP:exGauge := { | done | QOut("Enviando Arquivo: "+ farq + STR((done/cTamanho)*100,4)+" %") }
	   if oFtp:UploadFile( farq, cRoot + '/' + ftpdir + '/' + farq ) = .f.  
         @ maxrow(),1 say "Não é possível enviar o arquivo"
         return .f.
	   endif
	   oFTP:CWD( ".." )
		Millisec(1000) 
	   oFTP:Close()
   ENDIF
RETURN( .T.)
A variável cRoot, na rotina antiga era preenchida com o conteúdo de oFTP:ListFiles()[1,1]. No meu caso, retornava './'
Conferindo com o FileZilla, o arquivo estava sendo mesmo transferido, porém para a pasta './' (raiz)
Troquei por ''www' + 'NFP' e copiou certinho.

Obrigado pela ajuda.
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Responder