Página 2 de 4

Dois Exemplos de FTP - DownLoad

Enviado: 03 Ago 2012 19:33
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...

Dois Exemplos de FTP - DownLoad

Enviado: 04 Ago 2012 00:42
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.

Dois Exemplos de FTP - DownLoad

Enviado: 04 Ago 2012 13:14
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 !

Dois Exemplos de FTP - DownLoad

Enviado: 04 Ago 2012 13:20
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.

Dois Exemplos de FTP - DownLoad

Enviado: 04 Ago 2012 13:56
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,

Dois Exemplos de FTP - DownLoad

Enviado: 06 Ago 2012 02:34
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?

Dois Exemplos de FTP - DownLoad

Enviado: 06 Ago 2012 06:22
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()

Dois Exemplos de FTP - DownLoad

Enviado: 16 Ago 2012 11:17
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?

Dois Exemplos de FTP - DownLoad

Enviado: 16 Ago 2012 13:16
por bencz
Bom, se está acontecendo um erro, qual é o erro ?
Já tentou depurar ?

Dois Exemplos de FTP - DownLoad

Enviado: 16 Ago 2012 14:43
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.

Dois Exemplos de FTP - DownLoad

Enviado: 20 Ago 2012 15:49
por sygecom
Eu reli todos os post, mas não me achei mais, o que retorna .F. ?

Dois Exemplos de FTP - DownLoad

Enviado: 21 Ago 2012 17:40
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?

Dois Exemplos de FTP - DownLoad

Enviado: 24 Ago 2012 20:32
por sygecom
Não sei lhe dizer, talvez algum parâmetro errado que você está preenchendo.

Dois Exemplos de FTP - DownLoad

Enviado: 27 Ago 2012 22:45
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?

Dois Exemplos de FTP - DownLoad

Enviado: 13 Set 2012 23:25
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.