Página 1 de 1

Como baixar arquivos http?

Enviado: 28 Fev 2021 10:55
por carlos_dornelas
Pessoal, bom dia!

Estou tendo alguns problemas utilizando a rotina abaixo para baixar arquivos via http... o arquivo é baixado, porém é uma versão desatualizada do mesmo: parece que puxa de algum lugar do PC mesmo e não da internet... se eu baixo direto pelo navegador, o arquivo vem correto e atualizado.

Código: Selecionar todos

FUNCTION BaixarURLMON(url,arq)

nHandleDLL:=hb_LibLoad("UrlMon.dll")

nStatus:=hb_dynCall( { "URLDownloadToFileA", nHandleDLL,HB_DYN_CALLCONV_STDCALL},0,url,arq,0,0)


hb_LibFree(nHandleDLL)
RETURN Nil
Como vocês fazem para baixar via http?

Estou utilizando o harbour 3.2 night

[]s

Antonio Carlos

Como baixar arquivos http?

Enviado: 01 Mar 2021 10:47
por carlos_dornelas
Prezados,

Após mais pesquisas aqui no forum, encontrei mais algumas opções, mas ainda sem sucesso... Vejam só, das três funções abaixo, só a primeira que utiliza a DLL baixa o arquivo, porém o baixa desatualizado, o interessante é que se baixar o arquivo .zip direto pelo navegador o arquivo vem sempre o mais recente disponível... as outras duas funções baixa um arquivo .zip zerado.

O que está errado?

[]s

Antonio Carlos

Código: Selecionar todos


BaixarURLMON("http://www1.caixa.gov.br/loterias/_arquivos/loterias/d_loteca.zip","pri_loteca.zip")

Baixamur("http://www1.caixa.gov.br/loterias/_arquivos/loterias/d_loteca.zip","seg_loteca.zip")

Baixe("http://www1.caixa.gov.br/loterias/_arquivos/loterias/d_loteca.zip","ter_loteca.zip")



FUNCTION BaixarURLMON(url,arq)
nHandleDLL:=hb_LibLoad("UrlMon.dll")
nStatus:=hb_dynCall( { "URLDownloadToFileA", nHandleDLL,HB_DYN_CALLCONV_STDCALL},0,url,arq,0,0)
hb_LibFree(nHandleDLL)
RETURN Nil


function baixamur(url,arq)
cDownload := url
nSizeFiles := 1000000 // size inf bytes of the file
oUrl2 := tURL():New( cDownload )
lSuccess := .F.
WITH OBJECT ( TIPClientHTTP():New( oUrl2 ) )
   :nConnTimeout := 5000
   IF :Open( oUrl2 )
      :ReadToFile(arq,, 1000000 )
      :Close()
      lSuccess := .T.
   ENDIF
END


function baixe(url,arq)
oConn := TipClientHttp():New(TURL():New(URL))
oConn:nConnTimeout := 10000
IF oConn:Open(URL)
   oConn:ReadToFile(arq)
   oConn:Close()
ENDIF

Como baixar arquivos http?

Enviado: 02 Mar 2021 08:39
por Marcio-MMM
Uso o TipClientHTTP: e estou tendo o mesmo problema : baixa o arquivo com ZERO BYTES.
Retorna Generic error in writing
o Reply dá HTTP/1.1 400 Bad Request

Pelo Navegador, baixa direitinho...

Código: Selecionar todos

cUrl="http://provedor.com.br/"+alltrim(cFile)+" "+alltrim(cFile)
oUrl := TUrl():New( cUrl )
IF Empty( oUrl )
      @ 4, 5 SAY "Invalid url " + cUrl
ENDIF

oClient := TIPClientHTTP():new( oUrl )

IF Empty( oClient )
   	 return ""
ENDIF
oClient:nConnTimeout :=  20000 

IF oClient:Open()
   	@ 2,1 say cUrl
   	@ 3,1 say oUrl
   	@ 4,1 say cFile

	IF oClient:ReadToFile( cFile )
		 @ 7, 5 SAY "File " + cFile + " written."
		 @ 8, 5 SAY "Server replied " + oClient:cReply
	ELSE
		 @ 7, 5 SAY "Generic error in writing."  + cFile
	ENDIF
                        
      oClient:Close()
      @ 14,1 say oClient:cReply
      inkey(0)
ENDIF

Como baixar arquivos http?

Enviado: 02 Mar 2021 19:34
por JoséQuintas

Código: Selecionar todos

FUNCTION DownloadTexto( cUrl )

   LOCAL oSoap, cRetorno

   cRetorno := ""
   BEGIN SEQUENCE WITH __BreakBlock()
      oSoap := Win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
      oSoap:Open( "GET", cUrl, .F.)
      oSoap:Send()
      cRetorno := oSoap:ResponseBody()
   END SEQUENCE

   RETURN cRetorno

Como baixar arquivos http?

Enviado: 02 Mar 2021 20:14
por JoséQuintas
Com este outro funciona com ftp, talvez pra upload/download.

Código: Selecionar todos

PROCEDURE Main

   LOCAL a, b

   a := win_OleCreateObject( "microsoft.XMLHTTP" )
   a:Open( "GET", "ftp://ftp.josequintas.com.br/www/arquivos/jpa.exe", .F., "xxx", "xxx" )
   a:SetRequestHeader( "Content-Type", "application/x-www-form-urlencoded" )
   a:Send()
   b := a:ResponseBody()
   ? Len( b )
   hb_MemoWrit( "test.xxx", b )

   RETURN

Como baixar arquivos http?

Enviado: 04 Mar 2021 10:06
por Marcio-MMM
Valeu Quintas, de novo, matou a pau...
Grato demais.

Como baixar arquivos http?

Enviado: 17 Set 2022 16:29
por JAIR RANGEL
Olá, Mestres

Testando a rotina do Quintas para download de um arquivo.zip

Estou tentando baixar um arquivo .zip do Google Drive.
A rotina sempre baixa um arquivo em formato xml...

Teria como baixar somente o arquivo .zip que está no pasta do Google Drive?

Como baixar arquivos http?

Enviado: 17 Set 2022 16:53
por JoséQuintas
Vai ter que ver como funcionam as APIs do google drive.
Tentou baixar o mesmo link, SEM SER NO NAVEGADOR, pra ver se funciona?

Como baixar arquivos http?

Enviado: 18 Set 2022 12:11
por Linguagemclipper
Carlos, muitos servidores de páginas dinâmicas usam cache. Se o arquivo tem sempre o mesmo nome é provável que você esteja baixando do cache caso o arquivo esteja na pasta public_html que é onde ficam as páginas da web.
Por este motivo, recomendo que crie um diretório fora da pasta public_html para não sofrer esta ação do cache. Exemplo:

Código: Selecionar todos

cFTPFILE := "example.com/downloads/arquivo.zip" // coloque o caminho e nome do arquivo aqui
// FTP CREDENTIALS
oURL           := TUrl():new()
oUrl:cProto    := "ftp"
oUrl:cUserid   := cFTPUSER  
oUrl:cPassword := cFTPPASS  
oUrl:cServer   := cFTPSERVER
oUrl:nPort     := nFTPPORT  
oFTP := TIpClientFtp():new( oURL ) // ABRE CONEXÃO FTP  				
lCONEXAO := .T.
IF oFTP:OPEN()							
	MSGRODA("Verificando se há uma nova versão...", "W+/BG")
	IF oFTP:DOWNLOADFILE(cFTPFILE)
                   // [...]
	ENDIF 
ENDIF
Aliás, deixei de usar TIpClientHttp() por conta dessas coisas. Estou usando o FTP aí mesmo que é o protocolo de transmissão de arquivos.

Como baixar arquivos http?

Enviado: 21 Set 2022 15:15
por JAIR RANGEL
Olá, Pessoal

Não consegui baixar o arquivo.zip do Google Drive. Estava utilizando a TIPClientHTTP(), mas sem sucesso. Tentei também configurando para https, mas não rolou. Então, voltei com a rotina utilizando a TIPClientFTP(), a qual sempre funcionou de boa, baixando arquivo.zip no provedor DecolarHost. No entanto, este provedor anunciou a paralização do serviço a partir de Novembro/2022. Por este motivo estou tentando outra solução. Como o Google Drive é gratuíto até 15GB tentei usar alterando a função para TIPClientHTTP(). Mas como mencionei acima, não funcionou aqui...

Depois de voltar com a função TIPClientHTTP() contratei outro serviço de FTP no provedor FTPCloud.com.br
Acabei de fazer o cadastro no site. O bom é que podemos usar por 7 dias para testes, sem pagar nada por isso. Então, vou tentar fazer funcionar.

No momento estou aguardando a liberação das credenciais de acesso ao Server FTP da FTPCloud.

Não sei vocês, mas cada vez mais vejo que o trabalho de desenvolvimento desktop está em seus últimos dias...

Obrigado á todos

Como baixar arquivos http?

Enviado: 21 Set 2022 19:00
por Itamar M. Lins Jr.
Olá!
Testou esse aqui ?
https://drfone.wondershare.com.br/cloud ... drive.html
Imagem
Saudações,
Itamar M. Lins Jr.

Como baixar arquivos http?

Enviado: 23 Set 2022 11:02
por JAIR RANGEL
Bom dia, Amigos

Depois da liberação do novo servidor FTP a rotina de acesso voltou a funcionar. O problema era mesmo o servidor antigo: DecolarHost

Segue a rotina que uso para acesso:

Código: Selecionar todos

// =============================================================================
STATIC Function ATUALIZACAO_Automatica()    // ATUALIZAÇÃO AUTOMÁTICA de Versões
// =============================================================================
LOCAL cFile:="admv"+novaVersao+".zip"                           // Arq.Compactado de Atualização de Versão
LOCAL cTable:="ADMSTATUS.DBF", lVerify                          // lVerify: Var.boleana=Verifica se Cliente ATIVO/INATIVO p/atualização

ftpproto := "ftp://"                                            // Protocolo FTP
ftpuser  := "admsmart"                                          // Usuário da conta FTP
ftppass  := "nnnnnnnnnnnn"                                      // Senha da conta FTP
ftpserver:= "endereço server"                                   // Endereço de FTP
ftpPort  := 21                                                  // Porta, caso seja necessário informar na Url

cUrl     := ftpproto+ftpuser+":"+ftppass+"@"+ftpserver          // Url ftp
oUrl     := TUrl():new(cUrl)
oCred    := TIPCredentials()

oFTP     := TIPClientFTP():NEW(oUrl,,.T.)
oFTP:nConnTimeout := 20000
oFTP:bUsePasv := .T.

If FILE("ADMINSTAUTO.exe")                  // Se Instalador ADM existe, exclui o mesmo
   FERASE("ADMINSTAUTO.exe")
EndIf

If oFTP:Open()                              // Abre Conexão com Servidor FTP
   WAIT WINDOW "                Verificando atualização disponível. Aguarde...                   " NOWAIT

   oFTP:Cwd("/atualizacao")                 // Informa o DIRETORIO (no servidor FTP) onde está o Arquivo de atualização a ser baixado

   oFTP:DownLoadFile(cTable)                // Realiza Download da Tabela de STATUS de clientes do servidor FTP

   If ! FILE(cTable)                        // Verifica se Tabela Status Cliente foi baixada
      MsgINFO('PROBLEMA NA TRANSMISSÃO                       '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'Ocorreu um problema ao receber arquivos de    '+Chr(10)+Chr(13)+ ;
              'atualização.                                  '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'O acesso a internet pode estar com algum      '+Chr(10)+Chr(13)+ ;
              'problema momentâneo...                        '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13),'Atenção')
      oFTP:Close()                          // Encerra Conexão com Servidor FTP
      WAIT CLEAR                            // Fecha Janela de Mensagem
      Return                                // Encerra Rotina de ATUALIZAÇÃO
   EndIf

   lVerify:=VerifyClient(cTable)            // Verifica se Cliente está liberado para ATUALIZAÇÃO de Versão
   If ! lVerify                             // Cliente NÃO HABILITADO para Atualização Automática de Versão...
      oFTP:Close()                          // Encerra Conexão com Servidor FTP
      WAIT CLEAR                            // Fecha Janela de Mensagem
      Return                                // Encerra Rotina de ATUALIZAÇÃO
   EndIf

   WAIT CLEAR                               // Fecha Janela de Mensagem
   WAIT WINDOW "                Realizando download de atualização. Aguarde...                   " NOWAIT

   If ! FILE(cFile)                         // Verifica se Arquivo de atualização foi BAIXADO ANTERIORMENTE
      oFTP:DownLoadFile(cFile)              // Realiza Download do Arquivo
   EndIf

   If ! FILE(cFile)                         // Verifica se Arquivo de atualização foi BAIXADO
      MsgINFO('ATUALIZAÇÃO NÃO ENCONTRADA          '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'A atualização NÃO foi localizada    '+Chr(10)+Chr(13)+ ;
              'no Servidor web                     '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              'Uma nova tentativa será feita ao    '+Chr(10)+Chr(13)+ ;
              'reabrir o Sistema...                '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13)+ ;
              ' '+Chr(10)+Chr(13),'Atenção')
      oFTP:Close()                          // Encerra Conexão com Servidor FTP
      WAIT CLEAR                            // Fecha Janela de Mensagem
      Return                                // Encerra Rotina de ATUALIZAÇÃO
   EndIf

   If FILE(cFile)                           // Verifica se Arquivo de atualização foi baixado
      If hb_zipFileCRC32(cFile) = 0         // Verifica INTEGRIDADE do Arq.ZIP. Se Diferente de ZERO, é pq o CRC32 do Arq. está OK.
         MsgINFO('ARQUIVO '+cFile+' DANIFICADO                   ' +Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 'O Arquivo de próxima atualização do Sistema    '+Chr(10)+Chr(13)+ ;
                 'ADM Smart está corrompido.                     '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 'Assim que reabrir o ADM PAINEL este arquivo    '+Chr(10)+Chr(13)+ ;
                 'será baixado novamente.                        '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 'Caso esta mensagem continue a aparecer,        '+Chr(10)+Chr(13)+ ;
                 'contactar o Suporte.                           '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13)+ ;
                 ' '+Chr(10)+Chr(13),'Atenção')

         FERASE(cFile)                      // Deleta Arquivo de Atualização
         oFTP:Close()                       // Encerra Conexão com Servidor FTP
         WAIT CLEAR                         // Fecha Janela de Mensagem
         Return Nil                         // Encerra Rotina de ATUALIZAÇÃO
      EndIf
      WAIT CLEAR                            // Fecha Janela de Mensagem
      AtualizarVersao(cFile)
   EndIf
Else
   MsgINFO('CONEXÃO NEGADA                                         '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           'Não foi possível verificar por atualizações do         '+Chr(10)+Chr(13)+ ;
           'ERP-ADM Smart                                          '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           'O acesso a internet pode estar com algum problema      '+Chr(10)+Chr(13)+ ;
           'momentâneo                                             '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           'Uma nova tentativa de conexão será feita ao reabrir    '+Chr(10)+Chr(13)+ ;
           'o ADM PAINEL...                                        '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13)+ ;
           ' '+Chr(10)+Chr(13),'Atenção')
EndIf
oFTP:Close()                                // Encerra Conexão com Servidor FTP
CANCELAR_Atualizacao()
WAIT CLEAR                                  // Fecha Janela de Mensagem
Return
Mais uma vez, obrigado pela atenção dos nobres amigos!

Como baixar arquivos http?

Enviado: 27 Set 2022 11:59
por clodoaldomonteiro
Muito boa as dicas, já uso CreateObject("MSXML2.ServerXMLHTTP"), inclusive pra consumir API de consulta de dados de empresas passando CNPJ.

Código: Selecionar todos

   ////////////////////////////////////////////////////////////////////////////////
   //https://pctoledo.org/forum/viewtopic.php?f=43&p=155455#p155455
   //https://pctoledo.org/forum/viewtopic.php?f=4&t=23628 (com Header)
   //https://pctoledo.org/forum/viewtopic.php?f=4&t=17427 (usando a  hb_JSONDecode( cJSON, @hJSON ) )
   //https://nfe.io/docs/desenvolvedores/rest-api/consulta-de-cnpj-v1/ (para consultas)
   //https://pctoledo.org/forum/viewtopic.php?f=4&p=148594#p148594 (pode fazer FTP)
Function CNPJ_Consulta( cCnpj )
   Local mSite := "http://receitaws.com.br/v1/cnpj/", oHttp, hCNPJA := Hash(), mJSONCNPJ, hJSON := Hash()
   //mSite := "https://publica.cnpj.ws/cnpj/" //mais completo

   If Len( cCnpj ) <> 14
      REturn NIL
   Endif

   Begin Sequence

      Try
         oHttp := CreateObject("MSXML2.ServerXMLHTTP")
         oHttp:Open("GET", mSite + cCNPJ, .F.)
         oHttp:send()
      CATCH oError
         msg := 'Internet Error: 010' + CRLF
         msg += 'Aviso..: Erro verificado ao fazer requisição de CNPJ no Site indicado.' + HB_Eol()
         msg += 'Site...:' + mSite + HB_Eol()
         msg += 'CNPJ...:' + cCNPJ + HB_Eol()
         msg += cl_getError(oError, .t.)

         msgError ( msg )

         hCNPJA := NIL

         Break
      End

      If Empty( oHttp:responseText )
         hCNPJA := NIL
         Break

      ElseIf '"ERROR"' $ oHttp:responseText
         msg := 'Request error: 015' + CRLF
         msg += 'Aviso..: O retorno da consulta de CNPJ está com erros.' + HB_Eol()
         msg += '- Aguarde um minuto e tente novamente.' + HB_Eol()
         msg += 'Site...:' + mSite + HB_Eol()
         msg += 'CNPJ...:' + cCNPJ + HB_Eol()
         msg += 'Response:' + oHttp:responseText + HB_Eol()
         msg += 'Status..:' + Str(oHttp:status, 3) + HB_Eol()
         msg += cl_getError(, .t.)

         MsgError ( msg, .t. )

         hCNPJA := NIL
         Break

      ElseIf 'Too many' $ oHttp:responseText
         msg := 'Request error: 020' + CRLF
         msg += 'Aviso..: Muitas tentativas de pesquisar CNPJ no Site indicado.' + HB_Eol()
         msg += '- Aguarde um minuto e tente novamente.' + HB_Eol()
         msg += 'Site...:' + mSite + HB_Eol()
         msg += 'CNPJ...:' + cCNPJ + HB_Eol()
         msg += 'Response:' + oHttp:responseText + HB_Eol()
         msg += 'Status..:' + Str(oHttp:status, 3) + HB_Eol()

         MsgAtencao ( msg )

         hCNPJA := NIL
         Break
      Endif

      mJSONCNPJ   := HB_AnsiToOem(oHttp:responseText)

      //ADOStringGrava(mJSONCNPJ + CRLF)

      hCNPJA      := JSontoHash( mJSONCNPJ )

      oHttp       := NIL

   End Sequence

   Return hCNPJA

   /////////////////////////////////////////////////////////////////////////////
   //https://www.linguagemclipper.com.br/aprendendo-hash
Function JSonToHash( cStringJson )
   /***
   * Converte string formato Json em Hash
   */
   Local hJson := {=>}

   cStringJson := StrTran( cStringJson, ':[','=>{')
   cStringJson := StrTran( cStringJson, '":"','" => "')
   cStringJson := StrTran( cStringJson, '[','{')
   cStringJson := StrTran( cStringJson, ']','}')
   cStringJson := StrTran( cStringJson, '":null','"=>nil')
   cStringJson := StrTran( cStringJson, '":true' ,'"=>.t.' )
   cStringJson := StrTran( cStringJson, '":false','"=>.f.')
   cStringJson := StrTran( cStringJson, '":','"=>')
   cStringJson := StrTran( cStringJson, "\/","/" )

   hJSon := &( cStringJson )

   Return hJson

   /////////////////////////////////////////////////////////////////////////////
Function cl_LimpaString( cString )
   Local mRetorno

   mRetorno := StrTran( cString, '.', '' )
   mRetorno := StrTran( mRetorno, '-', '' )
   mRetorno := StrTran( mRetorno, '/', '' )
   mRetorno := StrTran( mRetorno, '\', '' )
   mRetorno := StrTran( mRetorno, ',', '' )

   Return mRetorno

   /////////////////////////////////////////////////////////////////////////////
Function cl_NulToString( cString )
   cString := If(cString = NIL, '', cString )
   Return cString