Dois Exemplos de FTP - DownLoad

Projeto HwGui - Biblioteca visual para Harbour/xHarbour

Moderador: Moderadores

Avatar do usuário
sygecom
Administrador
Administrador
Mensagens: 7131
Registrado em: 21 Jul 2006 10:12
Localização: Alvorada-RS
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

Para incluir no FTP eu uso assim:

Código: Selecionar todos

#include "inkey.ch"
#include "hwgui.ch"
#include "fileio.ch"
#include "common.ch"
#include "Directry.ch"

#define eFTPSERVER1  'ftp.servidor.com.br'        // ENDEREÇO SERVIDOR FTP  01
#define eFTPPORTA   21                            // PORTA DO FTP PARA BAIXAR ATUALIZAÇÕES DO SISTEMA
#define eFTPUSER    'usuario'                     // USUARIO DO FTP PARA BAIXAR ATUALIZAÇÕES DO SISTEMA
#define eFTPPASS    'senha'                       // SENHA DO FTP PARA BAIXAR ATUALIZAÇÕES DO SISTEMA


FUNCTION MAIN()
local aDir0, nTAMANHO:=0

aDir0 := directory('sistema.exe')
nTAMANHO:=aDir0[1,2]

IF UPLOAD_ARQ( "/pasta_destino", nTAMANHO, 'sistema.exe' ) = .F.
   MsgInfo('Enviou para ftp com sucesso')
ENDIF

RETURN NIL

********************************************************************
STATIC FUNCTION UPLOAD_ARQ( FTPDIR, cTamanho, farq )
********************************************************************
Local cUrl, oUrl, oFTP, cFTPSERVER:=''

cFTPSERVER:=eFTPSERVER1
cUrl := "ftp://" + eFTPUSER + ":" + eFTPPASS + "@" + cFTPSERVER

oUrl              := tUrl():New( cUrl )
oFTP              := tIPClientFtp():New( oUrl, .F. )
oFTP:nConnTimeout := 20000
oFTP:bUsePasv     := .T.
oFTP:nDefaultPort := eFTPPORTA   //PORTA DO FTP
oFTP:oUrl:cUserID := eFTPUSER
oFTP:oUrl:cServer   := cFTPSERVER
oFTP:oUrl:cPassword := eFTPPASS

IF oFTP:Open( cUrl )
   IF !oFTP:Cwd(ftpdir)  // se não achar o diretorio ele cria
      oFTP:MKD(ftpdir)     // muda o diretorio
   ENDIF
   oFTP:Cwd(ftpdir)     // muda o diretorio
   oFTP:reset()

   oFtp:exGauge := { | done | oSAY1:SETTEXT("Enviando Arquivo: "+ farq + STR((done/cTamanho)*100,4)+" %") }
   oFtp:UploadFile( farq )

   Millisec(1000)

   oFTP:Close()  // fehca a conexão do FTP
ELSE
   RETURN .F.
ENDIF
RETURN .T.
Para excluir faço na mão, mas se procurar nas classe do xHarbour deve ter algum: oFTP:DELE(cARQUIVO), boa sorte...
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:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

A exclusão deu certo, obrigado.

Mas, para o envio, preciso da HWGUI.CH, né? Vc sabe onde posso obtê-la? Não consegui localizá-la na seção de Downloads do grupo.

Mais uma questão, por favor: vi no teu exemplo que a função oFTP:List() fornece uma lista dos arquivos que estão na pasta do FTP para serem baixados, que é exatamente o que eu preciso. Entretanto, essa lista, baixada em clista, aparentemente está em um vetor, ou numa string de caracteres todos juntos, e não estou sabendo trabalhar com ela.

Existe um jeito de colocar a lista num arquivo TXT, ou quem sabe até numa base de dados (DBF), de preferência só com os nomes dos arquivos (sem os demais dados), para que eu possa usá-los como parâmetros para baixar todos os arquivos, um a um?

Obrigado por tua disposição em ajudar.
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:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

cjp escreveu: Mas, para o envio, preciso da HWGUI.CH, né? Vc sabe onde posso obtê-la? Não consegui localizá-la na seção de Downloads do grupo.
Não precisa não, foi sem querer...pode tirar fora, e onde tem o :SETTEXT() pode alterar para um SAY para mostrar na tela.
cjp escreveu: Mais uma questão, por favor: vi no teu exemplo que a função oFTP:List() fornece uma lista dos arquivos que estão na pasta do FTP para serem baixados, que é exatamente o que eu preciso. Entretanto, essa lista, baixada em clista, aparentemente está em um vetor, ou numa string de caracteres todos juntos, e não estou sabendo trabalhar com ela.

Existe um jeito de colocar a lista num arquivo TXT, ou quem sabe até numa base de dados (DBF), de preferência só com os nomes dos arquivos (sem os demais dados), para que eu possa usá-los como parâmetros para baixar todos os arquivos, um a um?
Ela tem problema, primeiro que é uma STRING e segundo que o retorno e posição pode mudar de um servidor(hospedagem) para outro, mas pode pegar esse texto e tentar tratar ele para pegar as informações que quiser usando AT() e SUBSTR().
Se serve como conselho para baixar arquivos eu acho mais eficiente via HTTP pelo não limite de usuários simultâneo baixando arquivos.
Obrigado por tua disposição em ajudar.
Vamos todos se ajudando !
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:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

Desculpe minha ignorância, mas o que é HTTP? Dá pra rodar isto na minha função compilada em Xharbour?

Não sabia que havia limite de usuários no FTP, mas esse limite deve ser meio alto, não? Essa minha função roda com no máximo 5 usuários. Não creio que isso seja problema.
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:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

cjp escreveu:Desculpe minha ignorância, mas o que é HTTP?
HTTP é via DOWNLOAD em vez de conectar no FTP e baixar o arquivo, você baixa ele via LINK direto:
http://www.meusite.com.br/arquivo.zip
Dá pra rodar isto na minha função compilada em Xharbour?
Sim
Não sabia que havia limite de usuários no FTP, mas esse limite deve ser meio alto, não? Essa minha função roda com no máximo 5 usuários. Não creio que isso seja problema.
Todo FTP tem limite de usuários sim, ai depende da Hospedagem de onde está o FTP, verifique o teu caso.

Exemplo usando HTTP:

Código: Selecionar todos

***************
FUNCTION MAIN()
***************
Local cURL, lRet:=.F.
Local nTAMANHO:=0
LOCAL  oConn

cURL := "http://www.meusite.com.br/arquivo.rar"

nTAMANHO := GET_FILE_SIZE('arquivo.rar') // aqui uso uma função em PHP para pegar o tamanho do arquivo

TRY
  oConn := TipClientHttp():New(TURL():New(cURL))
  oConn:nConnTimeout := 10000
  oConn:exGauge := { | done, size| ShowGauge(done, size, nTAMANHO ) }

  IF oConn:Open(cURL)
     oConn:ReadToFile('c:\salva_nessa_pasta\nome_do_arquivo.rar')
     oConn:Close()
  ENDIF
  lRet:=.T.
CATCH
  lRet:=.F.
END
RETURN(lRet)

******************************************
PROCEDURE SHOWGAUGE( nSent, nSize, nTotal)
******************************************
IF nSent > 0
   @ 10,10 SAY STR(nSent/1000000)+" Mb de: " + str(nTotal/1000000)+ " Mb "+str((nSent/nTotal)*100,4) +" %"
ENDIF
RETURN

************************************
FUNCTION GET_FILE_SIZE(cCAMINHO_URL)
************************************
LOCAL nRET_BYTS:=0
LOCAL oHttp, cHtml:=''

IF Empty( cCAMINHO_URL )
   Return(nRET_BYTS)
ENDIF

TRY
   oHttp:= TIpClientHttp():new( "http://www.meusite.com.br/tamanhoArquivo.php?caminho="+alltrim(cCAMINHO_URL))
CATCH
   Return(nRET_BYTS)
END
IF oHttp:open()
   cHtml   := oHttp:readAll()

   IF !EMPTY(cHtml)
      IF LEN(cHTML) > 0 .AND. LEN(cHTML) < 20
         nRET_BYTS:=VAL(alltrim(cHTML))
      ENDIF
   ENDIF
ENDIF
oHttp:close()
RETURN(nRET_BYTS)
Em anexo a função PHP que uso para pegar o tamanho do arquivo no site para poder fazer uma barra de progresso do que está baixando,
Anexos
tamanhoArquivo.rar
(306 Bytes) Baixado 416 vezes
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:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

Meu caro,

A função de envio funcionou. Muito obrigado.

Quanto à função de recebimento, verifiquei a função HTTP que vc gentilmente me mandou. Salvo se eu estiver enganado, ela também não resolve o meu problema, que é saber o nome dos arquivos a baixar.

A questão é a seguinte: eu coloco no FTP vários arquivos, para que os usuários baixem. Na função que eu uso atualmente, um bat no ftp do dos, eu listo para um .TXT os nomes dos arquivos, e daí os baixo um a um. Era isso que eu precisava fazer usando uma das tuas sugestões (HTTP ou oFTP).

Como não tenho problema com o número de usuários, ambas as funções me servem. Só precisava de um jeito de baixar primeiro a lista dos arquivos disponíveis. Tem como?
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:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

olá
Para listar via HTTP vc vai precisar de algum script em php que lhe devolva os arquivos de determinada pasta, mas se usar FTP pode pegar essa lista com: oFTP:LIST()
O problema que tem que tratar esse texto retornado por oFTP:LIST()
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:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

Meu caro, vou precisar lhe incomodar novamente com isto.

Na função de envio, frequentemente, está ocorrendo um erro na linha oFTP:Open ( cUrl ). Não sei porquê, mas frequentemente ela não consegue abrir o FTP.

Existe alguma forma de descobrir a razão deste problema? Ela dá algum retorno para sabermos o porquê não abre?

Convém notar que a conexão à internet está normal, e o FTP também está acessível perfeitamente por outros meios.

Poderia me ajudar, por favor?
Inacio de Carvalho Neto
Avatar do usuário
bencz
Usuário Nível 4
Usuário Nível 4
Mensagens: 524
Registrado em: 28 Abr 2012 17:36
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por bencz »

Bom, se está acontecendo um erro, qual é o erro ?
Já tentou depurar ?
Imagem
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

O problema é que eu não sei qual é o erro. Apenas essa função retorna .f. Eu queria era justamente porque ela está retornando .f.

Infelizmente não sei usar o depurador, por isso não consigo depurar o erro.

Na verdade não sei nem se é propriamente um erro. Apenas tá retornando .f., ou seja, não está conseguindo abrir o FTP.
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:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

Eu reli todos os post, mas não me achei mais, o que retorna .F. ?
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:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

A questão é a seguinte: nas funções que vc me passou, ele está às vezes retornando .f. na seguinte função: oFTP:Open( cUrl ).

Eu testo abrir o ftp por meio do comando ftp do dos e abre normalmente. Por que então esta função não consegue abri-lo?
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:

Dois Exemplos de FTP - DownLoad

Mensagem por sygecom »

Não sei lhe dizer, talvez algum parâmetro errado que você está preenchendo.
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:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

Mas, se fosse algum erro de parâmetro, vc não acha que daria o erro sempre? O estranho é que, às vezes funciona, às vezes não.

Esta função não retorna o código do erro, pra eu tentar descobrir qual a causa do erro?
Inacio de Carvalho Neto
cjp
Usuário Nível 6
Usuário Nível 6
Mensagens: 1563
Registrado em: 19 Nov 2010 22:29
Localização: paraná
Contato:

Dois Exemplos de FTP - DownLoad

Mensagem por cjp »

Meus caros,

Vocês sabem me informar se pela função oftp:Downloadfile() seria possível baixar de uma vez todos os arquivos que estiverem em determinada pasta do FTP?

Algo do tipo oFtp:DownloadFile(*.*), ou algo assim? Assim eu já testei, mas nem compila, dá erro no *. Também já testei oFtp:DownloadFile() (sem argumento), mas também não baixa.

Será que existe algum argumento que permita baixar todos os arquivos da pasta? Ou quem sabe alguma função semelhante a esta que faça isto?

Agradeço toda a ajuda.
Inacio de Carvalho Neto
Responder