Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-06-2019
Chaja Chaja is offline
No confirmado
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 238
Poder: 0
Chaja Va por buen camino
Descarga de Archivo zip del BCRA

Hola
antes que nada he buscado el tema pero creo que no es lo que yo busco, o al menos no lo vi.
Necesto descargar un archivo desde una pagina del Banco Central (BCRA) que es un ZIP. esta es el enlace http://www.bcra.gob.ar/cheques/actualiza.asp
se publica un archvo cada dos o tres dias. la idea es bajar el archivo de forma automatica y descomprimirlo en una carpeta pero no tengo ni la mas remota idea de como hacerlo..
Alguna sugerencia???
Responder Con Cita
  #2  
Antiguo 26-06-2019
el-mono el-mono is offline
Miembro
 
Registrado: abr 2008
Ubicación: Lules
Posts: 176
Poder: 16
el-mono Va por buen camino
Luis como estas.
Si te fijas cuando bajas un archivo te da una URL como esta:
"http://www.bcra.gob.ar/zips/cheques/20190625.zip"

Donde el archivo zip es una fecha, seria cuestión que armes la URL con la fecha que quieras bajar. Para ello armaría una función que me devuelva el archivo y lo descomprima, o que devuelva falso si para esa fecha no encontró nada.

Es una solución traída de los pelos.



Saludos
Tucuman - Argentina
Responder Con Cita
  #3  
Antiguo 26-06-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Hola

El proceso es el siguiente:
- descargar el contenido HTML de la página
- Analizar el contenido HTML en busca del patrón que contenga los ficheros que deseas
- Descargar el fichero desde la URL obtenida anteriormente.

Aquí te dejo un código de ejemplo, para que funcione inserta un componente TIdHTTP de las indy en tu formulario

Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);

  function GetHTMLContent(const AURL: string): string;
  begin
    Result := '';
    if AURL <> '' then
    try
      try
        Result := IdHTTP1.Get(AURL);
      finally
        if (IdHTTP1.ResponseCode <> 200) then begin
          Result := '';
          MessageDlg(IdHTTP1.ResponseText, mtError, [mbOK], 0);
        end;
      end;
    except
      on E: Exception do
        MessageDlg(E.message, mtError, [mbOK], 0);
    end;
  end;

  function GetURLZip(const AContent: string; const Prefijo: string = '''../zips/cheques/'; const Sufijo: string = '.zip'''): string;
  var
    inicio, fin, longitud:Integer;
  begin
    Result := '';
    // localiza el inicio de la cadena de descarga
    inicio := Pos(Prefijo, AContent);
    if inicio > 0 then begin
      // localiza el fin de la cadena de descarga
      fin := Pos(Sufijo, AContent, inicio);
      if (fin > inicio) then begin
        // calcula la longitud
        longitud := (fin + Sufijo.Length) - inicio;
                //extrae la cadena
        Result := Copy(AContent, inicio, longitud);
        // la cadena esta en formato '../XXX/XXX.zip'
        // se elimina las comillas iniciales y finales y los dos puntos
        Result := result.Replace('''', '').Replace('../', '');
      end;
    end;
  end;

  function ExtractFileNameFromURL(const AURL: string): string;
   /// este proceso separa las partes de una URL y obtiene solo la ultima parte.
   /// no esta optimizado en cuanto que pudiera llevar parámetros o no ser un nombre del fichero valido.
   /// pero para este caso en concreto es suficiente
  Begin
    with TStringList.Create do
    try
      StrictDelimiter := true;
      Delimiter := '/';
      DelimitedText := AURL;
      Result := Strings[count - 1];
    finally
      Free;
    end;
  End;

  function DescargarFileURL(const AURL: string): string;
  var
    s: TStream;
    LocalFileName:string;
  begin
    Result := '';
    try
      LocalFileName := ExtractFilePath(Application.ExeName) + ExtractFileNameFromURL(AURL);
      s := TFileStream.Create(LocalFileName, fmCreate);
      try
        IdHttp1.Get(AURL, s);
        if IdHTTP1.ResponseCode = 200 then
          result := LocalFileName
        else
          MessageDlg(IdHTTP1.ResponseText, mtError, [mbOK], 0);
      finally
        s.Free;
      end;
    except
      on E: Exception do
        MessageDlg(E.message, mtWarning, [mbOK], 0);
    end;
  end;

  function DonwloadZIP (const APageBase, AURL:string):string;
  var
    HTMLContent,          //Contenido de la pagina en HTML
    URLZip: string;        // URL al fichero ZIP
    LocalFileZip: string; // Ruta local al fichero ZIP
  begin
    // Se descarga el contenido de la pagina en formato HTML
    HTMLContent := GetHTMLContent(APageBase + AURL);
    if (HTMLContent = '') then
      MessageDlg('No se ha podido realizar la descarga', mtError, [mbOK], 0)
    else begin
      // Se busca la primera URL a un fichero ZIP
      URLZip := GetURLZip(HTMLContent);
      if URLZip = '' then
        MessageDlg('No se ha podido extraer la URL del fichero ZIP', mtError, [mbOK], 0)
      else begin
        LocalFileZip := DescargarFileURL(APageBase + URLZip);
        if LocalFileZip = '' then
          MessageDlg('No se ha podido descargar el fichero ZIP desde la URL ', mtError, [mbOK], 0)
        else
          result := LocalFileZip;
      end;
    end;
  end;

var
  FileName: string;
begin
  FileName := DonwloadZIP('http://www.bcra.gob.ar/', 'cheques/actualiza.asp');
  if FileName <> '' then
    MessageDlg('Descarga completa', mtInformation, [mbOK], 0)
  else
    MessageDlg('Error en la descarga', mtError, [mbOK], 0);
end;

Añadir que como peculiaridad, para realizar las llamadas he separado la URL en dos partes, <ruta publica del servidor> y ruta al script que se va a ejecutar. Con esto se facilita el poder obtener luego la ruta al ZIP, puesto que la URL del zip contiene "../" que es un retroceso en la carpeta de la ruta con respecto a la ruta que hay en el momento.

saludos
Responder Con Cita
  #4  
Antiguo 26-06-2019
Chaja Chaja is offline
No confirmado
 
Registrado: ago 2004
Ubicación: Mar del Plata
Posts: 238
Poder: 0
Chaja Va por buen camino
Wink

Ahora emtiendo por que no soy millonario.... Bucanero es es exelente....no entiendo como sabe, de que debe bajar el ultimo archivo... me doy cuenta que solo soy un simple Mortal.... y ya que esta te pregunto... no es posible listar los archivos disponibles ... por si uno quiere bajar uno anterior... gracias que existen personas que saben.... gracias Maestro Yoda

Ahora me queda descomprimirlo .....
Responder Con Cita
  #5  
Antiguo 27-06-2019
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
Post

Cita:
Empezado por Chaja Ver Mensaje
Ahora emtiendo por que no soy millonario.... Bucanero es es exelente....no entiendo como sabe, de que debe bajar el ultimo archivo... me doy cuenta que solo soy un simple Mortal.... y ya que esta te pregunto... no es posible listar los archivos disponibles ... por si uno quiere bajar uno anterior... gracias que existen personas que saben.... gracias Maestro Yoda

Ahora me queda descomprimirlo .....
Pues con lo de millonario... ya te digo que yo tampoco lo soy
Y maestro... pues tampoco lo creo, solo se trata de aportar en algunos temas de los que pueda conocer un poco

En cuanto a tu pregunta de como saber cual es el ultimo fichero que se ha subido y por tanto el que hay que descargar, es porque en tu listado HTML los ficheros van ordenados de mas recientes a mas antiguos, por eso el primero que encuentra es el mas reciente y no continua con la búsqueda.

Si lo que deseas es obtener la lista completa de ficheros disponibles, con unas pequeñas modificaciones al código que te propuse se consigue fácilmente:

La función GetURLZip la convierto a procedimiento pasandole un nuevo parámetro de tipo TStrings donde va a devolver toda la lista de ficheros obtenidos
Código Delphi [-]
procedure GetURLZip(const AContent: string; Alist:TStrings; const Prefijo: string = '''../zips/cheques/'; const Sufijo: string = '.zip''');
  var
    inicio, fin, longitud:Integer;
    AFile:string;
  begin
    Alist.clear;
    inicio := 1;
    while inicio > 0 do begin
      // localiza el inicio de la cadena de descarga
      inicio := Pos(Prefijo, AContent, inicio);
      if inicio > 0 then begin
        // localiza el fin de la cadena de descarga
        fin := Pos(Sufijo, AContent, inicio);
        if (fin > inicio) then begin
          // calcula la longitud
          longitud := (fin + Sufijo.Length) - inicio;
                //extrae la cadena
          AFile := Copy(AContent, inicio, longitud);
          // la cadena esta en formato '../XXX/XXX.zip'
          // se elimina las comillas iniciales y finales y los dos puntos
          Alist.Add(AFile.Replace('''', '').Replace('../', ''));
        end;
        inicio := fin + 1;
      end;
    end;
  end;

la función DonwloadZIP tienes que separarla en dos partes:
1.- una la encargada de descargar el HTML y su correspondiente análisis, a esta yo le he cambiado el nombre y queda así:

Código Delphi [-]
  function DonwloadListZIP (const APageBase, AURL:string; AList:TStrings):string;
  var
    HTMLContent,          //Contenido de la pagina en HTML
    LocalFileZip: string; // Ruta local al fichero ZIP
  begin
    // Se descarga el contenido de la pagina en formato HTML
    HTMLContent := GetHTMLContent(APageBase + AURL);
    if (HTMLContent = '') then
      MessageDlg('No se ha podido realizar la descarga', mtError, [mbOK], 0)
    else begin
      // Se busca la primera URL a un fichero ZIP
      GetURLZip(HTMLContent, AList);
    end;
  end;

Inserta un listbox en tu formulario y en el botón de carga

Código Delphi [-]
procedure TForm2.Button1Click(Sender: TObject);
begin
  DonwloadListZIP('http://www.bcra.gob.ar/', 'cheques/actualiza.asp', ListBox1.Items);
end;
2.- y la parte correspondiente a la descarga del propio fichero ZIP, llevala al evento dobleClick del listBox:

Código Delphi [-]
procedure TForm2.ListBox1DblClick(Sender: TObject);
var
  LocalFileZip: string;
begin
  with ListBox1 do
    if ItemIndex >= 0 then begin
      LocalFileZip := DescargarFileURL('http://www.bcra.gob.ar/' + items[ItemIndex]);
      if LocalFileZip = '' then
        MessageDlg('No se ha podido descargar el fichero ZIP desde la URL ', mtError, [mbOK], 0)
      else
        MessageDlg(LocalFileZip, mtInformation, [mbOK], 0);
    end;
end;
En cuanto a descomprimir el fichero ZIP y obtener los datos que contiene, puedes hacerlo:
-Con ShellApi a compresores externos como el propio WINZIP, WINRAR, etc. con sus correspondientes parámetros. Como desventaja, el programa tiene que estar instalado en el equipo del cliente y aquí no puedes controlar casi nada en el proceso de descompresión.
-Con componentes de compresión de ficheros para delphi (yo en particular utilizo el componente TZIPMASTER) funciona aunque no haya instalado ningún programa de compresión externo, y en este caso si que podrás utilizar las propias herramientas del componente para listar los ficheros contenidos y/o descomprimir selectivamente lo que puedas necesitar.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Descarga y Carga de un Archivo cacu OOP 2 26-04-2010 15:15:48
Descarga archivo TIBFTP mjjj API de Windows 2 08-01-2009 18:07:40
Forzar descarga de archivo. ixMike HTML, Javascript y otros 5 18-11-2007 20:46:26
Barra Progreso descarga archivo Rockin Internet 2 20-10-2007 13:19:10
Descarga archivo cliente/servidor edgusano Internet 11 20-09-2004 18:01:44


La franja horaria es GMT +2. Ahora son las 06:40:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi