Página 1 de 1

Download de arquivos via FTP -> Atualização automática

Enviado: 25 Jan 2017 16:50
por Cisino Junior
Boa tarde.
Sei que já existe alguns tópicos sobre o assunto, mas gostaria de deixar aqui minha versão de uma função postada pelo Toledo no seguinte tópico a alguns anos atrás. https://pctoledo.org/forum/viewto ... =46&t=7587

Estou postando isso para novos usuários e antigos, com as modificações que eu fiz na função. Espero que seja útil para alguém.
Tentei comentar o máximo para facilitar o uso da função.

Código: Selecionar todos

// =============================================================================
Function Donwload_Auto() // Realiza download de atualização via ftp
// =============================================================================
local cFile, aExtract:={}, versaoInstalada, novaVersao
ftpproto ="ftp://"
ftpserver = "" //endereço de FTP do site
ftpuser = "" //Usuário da conta FTP
ftppass = ""  //Senha da conta FTP
curl:=ftpproto+ftpuser+":"+ftppass+"@"+ftpserver // url ftp
oUrl:= turl():new(curl)
oCred:= tIPCredentials()
oFtp:= tipclientftp():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv  := .T.

      // Aqui você pega a versão instalada no cliente, no meu caso, ela fica em uma tabela dbf 
      // já aberta em outro lugar do sistema, deixei de exemplo...
      Sele tb        // Recupera Identificação da Versão Instalada.
      dbSetOrder(1)
      dbGoTop()
      dbSeek('versao') // procura a versão na tabela
      versaoInstalada:=If(Found(),ALLTRIM(tb->versao),' ')

      /*
      ** Pode-se usar um array com o nome dos arquivos a serem baixados do servidor ftp
      ** caso seja necessário, só fazer algo do tipo:
      ** for i:=0 to len(aFiles) -> aFiles é o array contendo o nome dos arquivos a serem baixados
      **      oFtp:DownLoadFile(aFiles[i])  // -> realiza o download de todos os arquivos listados no array
      ** next i
      */
      cFile:="arquivo" // -> arquivo zip contendo programa atualizado

      If oFTP:Open() // Abre conexão ftp

         oFTP:Cwd("/public_html/atualizacao/update")  // informe o diretorio (no servidor ftp) onde está o arquivo versao.txt

         If !empty(clista:=oFTP:List())
            oFtp:DownLoadFile("update\versao.txt") // baixa o arquivo versão.txt existente na pasta update no servidor ftp

            If file("update\versao.txt")       // se exister o arquivo,
               HAND=FOPEN("update\versao.txt") // abre o arquivo txt
               novaVersao=FREADSTR(HAND,4)     // pega os primeiros 4 bytes do arquivo e atribui à variável local
               FCLOSE(HAND)                    // fecha arquivo txt
               ferase("update\versao.txt")     // apaga o arquivo txt de versão baixado do servidor ftp
             Else
                 msgInfo("Erro: Arquivo de versão não encontrado!"+Chr(10)+Chr(13)+ ;
                         "Verifique sua conexão com a internet e tente novamente!", "Atenção!")
                 return nil
            EndIf

            oFTP:Cwd("/public_html/atualizacao")  // informe o diretorio (no site) onde está os arquivos de atualização a serem baixados

            If VAL(novaVersao) > VAL(versaoInstalada) // verefica se tem versão disponivel

               If MsgYesNo("Há uma nova versão do sistema disponível, deseja atualizar agora ?")

                  If !empty(clista:=oFTP:List()) // Verifica se realmente existe arquivos no servidor

                     oFtp:DownLoadFile(cFile) // realiza download dos arquivos

                     dbSeek('versao')     // Grava nova versão na tabela dbf
                     If Found()
                        If ! RDREC() ; Return ; EndIf
                           Replace versao With novaVersao
                           dbCommit() ; dbUnlock()
                     EndIf

                     msgInfo("Software atualizado da versão: "+versaoInstalada+" para a versão: "+novaVersao)
                   EndIf
               EndIf
            EndIf

            oFTP:Close() // -> encerra conexão com servidor ftp
         EndIf
        Else
            msgInfo("Error ao tentar conectar no servidor de atualização,"+Chr(10)+Chr(13)+ ;
                    "por favor verifique sua conexção com a internet!", "Atenção!")
      EndIf

Return
Atenciosamente,
Cisino Junior. Estudante de Sistemas de Informação.

HMG 3.4.3 + DBF + Java + MySQL + PHP + JavaScript + HTML5 + CSS3 + Unity(C#)

Download de arquivos via FTP -> Atualização automática

Enviado: 25 Jan 2017 17:04
por rubens
Boa tarde Cisino,

Desculpe minha ignorância no assunto, E do seu lado, do lado do servidor, o que precisa?

Obrigado
Rubens

Download de arquivos via FTP -> Atualização automática

Enviado: 25 Jan 2017 17:32
por Cisino Junior
Boa tarde, rubens!
O asimoes postou a um tempo um tutorial de como configurar um servidor ftp utilizando o Fillezila server. https://pctoledo.org/forum/viewto ... tp#p107379

Aqui eu utilizei o servidor ftp do Hostinger, é só você criar uma conta gratuita e depois criar uma conta de acesso ao servidor ftp que eles te fornecem.
https://www.hostinger.com.br/

E no lado client, eu utilizei o Fillezila Client, o Fillezila é open source e gratuito. Com esse software você consegue acessar seu servidor ftp e realizar uploud, download, etc dos seus arquivos. é bem simples de utilizar.

Qualquer dúvida fique a vontade para perguntar.

Atenciosamente,
Cisino Junior. Estudante de Sistemas de Informação.

Download de arquivos via FTP -> Atualização automática

Enviado: 25 Jan 2017 18:18
por JoséQuintas
Desculpe minha ignorância no assunto, E do seu lado, do lado do servidor, o que precisa?
Do lado do servidor, precisa um servidor... rs

Se tiver um site hospedado na internet, já tem seu servidor pronto pra uso.

Uso isso desde os tempos do Clipper, talvez mais de 10 anos.

No Harbour 3.2 isso tinha bug. Já foi resvolvido?
Problemas com formato de data.

No 3.2 eu precisava aplicar herança pra modificar o método de pegar os arquivos.

Código: Selecionar todos

CREATE CLASS MyTIPClientFTP INHERIT TIPClientFTP

   METHOD ListFiles( cFileSpec )

   END CLASS

METHOD ListFiles( cFileSpec ) CLASS MyTIPCLientFTP

   LOCAL aList, aFile, cEntry, aListFiles := {}
   LOCAL cYear, cMonth, cDay, cTime, cName, cSize, cAttrib, cList, nCont

   cList := ::list( cFileSpec )

   IF Empty( cList )
      RETURN aListFiles
   ENDIF

   aList := hb_ATokens( StrTran( cList, Chr( 13 ) ), Chr( 10 ) )

   FOR nCont = 1 TO Len( aList )
      cEntry := aList[ nCont ]    // 05-03-13  06:18PM              2115072 jpa.exe

      IF ! Empty( cEntry )
         aFile  := Array( 5 )
         cEntry := AllTrim( cEntry )

         cDay   := Substr( cEntry, 1, 2 )
         cMonth := Substr( cEntry, 4, 2 )
         cYear  := "20" + Substr( cEntry, 7, 2 )
         cEntry := AllTrim( Substr( cEntry, At( " ", cEntry ) ) )

         cTime := AllTrim( Substr( cEntry, 1, At( " ", cEntry ) ) )
         cEntry := AllTrim( Substr( cEntry, At( " ", cEntry ) ) )

         cSize  := AllTrim( Substr( cEntry, 1, At( " ", cEntry ) ) )
         cEntry := AllTrim( Substr( cEntry, At( " ", cEntry ) ) )

         cName := cEntry

         cAttrib := ""

         aFile[ F_NAME ] := cName
         aFile[ F_SIZE ] := Val( cSize )
         aFile[ F_ATTR ] := cAttrib
         aFile[ F_DATE ] := hb_SToD( cYear + cMonth + cDay )
         aFile[ F_TIME ] := cTime

         Aadd( aListFiles, aFile )

      ENDIF

   NEXT

   RETURN aListFiles

Download de arquivos via FTP -> Atualização automática

Enviado: 26 Jan 2017 13:26
por Cisino Junior
JoséQuintas escreveu:No Harbour 3.2 isso tinha bug. Já foi resvolvido?
Problemas com formato de data.
Boa tarde Quintas!
Não sei informar se esse bug foi resolvido, o problema que você diz era ter que utilizar o formato dos EUA(yyyy/mm/dd) e não conseguir utilizar o formato BR(dd/mm/yyyy)?

Se me permite também, você saberia me dizer como posso fazer uma barra de progresso para mostrar ao usuário o andamento do download?? Aqui utilizamos a HMG 3.4.3

Atenciosamente,
Cisino Junior.

Download de arquivos via FTP -> Atualização automática

Enviado: 26 Jan 2017 14:41
por JoséQuintas
Por coincidência olhei uma anotação hoje

Código: Selecionar todos

/*
FUNCTION DownloadTexto( cUrl )

   LOCAL oFileContent := "", oHttp

   BEGIN SEQUENCE WITH __BreakBlock()
      oHttp := TIPClientHttp():New( cUrl )
      oHttp:Open()
//      oHttp:ExGauge := { | done, size | GrafTempo( Done, Size ) } // nao funciona se nao souber o tamanho
      oFileContent := oHttp:ReadAll()
      oHttp:Close()
   END SEQUENCE
   RETURN oFileContent
*/

Download de arquivos via FTP -> Atualização automática

Enviado: 26 Jan 2017 14:54
por Cisino Junior
JoséQuintas escreveu:Por coincidência olhei uma anotação hoje
Nesse caso seria download por Http, ou posso fazer o download pelo ftp e usar essa função para montar o progresso da atualização?

Atenciosamente,
Cisino Junior.

Download de arquivos via FTP -> Atualização automática

Enviado: 26 Jan 2017 16:06
por JoséQuintas
Provavelmente sim, no final é tudo tipclient.