Visualizzazione dei risultati da 1 a 9 su 9

Discussione: [DELPHI] Download file

  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18

    [DELPHI] Download file

    Ho necessità di effettuare il download di un file. Il codice che ho utilizzato e il seguente.
    Vorrei utilizzare una progressbar. Per ottenere l'avanzamento non è un problema e ho gia modificato il codice. Il problema che non riesco a risolvere è la determinazione del MaxValue della barra.
    QUalcuno potrebbe aiutarmi? Grazie a tutti.

    function GetInetFile ( fileURL, FileName: String;G:TGauge): boolean;
    const BufferSize = 1024;
    var
    hSession, hURL: HInternet;
    Buffer: array[1..BufferSize] of Byte;
    BufferLen: DWORD;
    Incremento:Integer;
    f: File;
    sAppName: string;
    begin

    Result:=False;
    sAppName := ExtractFileName(Application.ExeName);
    hSession := InternetOpen(PChar(sAppName),INTERNET_OPEN_TYPE_PR ECONFIG,nil, nil, 0);
    try
    hURL := InternetOpenURL(hSession,PChar(fileURL),nil,0,0,0) ;
    try
    AssignFile(f, FileName);
    Rewrite(f,1);
    G.MaxValue:=5;


    repeat
    InternetReadFile(hURL, @Buffer,SizeOf(Buffer), BufferLen);
    G.Progress:=G.Progress + ((filesize (f) div 10000)-Incremento);
    Incremento:= Filesize (f) div 10000;

    BlockWrite(f, Buffer, BufferLen);

    Application.ProcessMessages;

    until BufferLen = 0;
    CloseFile(f);
    Result:=True;
    finally
    InternetCloseHandle(hURL)
    end
    finally
    InternetCloseHandle(hSession)
    end
    end;

  2. #2
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Devi trovare il modo di ottenere la dimensione del file che stai tentando di scaricare.

    Hai provato ad utilizzare i più flessibili e semplici componenti Indy?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    No, perchè non saprei proprio come utilizzarli! Se non è troppo lungo potresti darmi qualche dritta? Grazie.

  4. #4
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Hai già provato a guardare sul sito ufficiale della Nevrona Designs.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    Ho guardato tutto ieri in giro per la rete. Ma non ho trovato molto. I componenti indy sono molti potresti dirmi da cosa pertire?Grazie Ciao.

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Purtroppo non ho il tempo di costruire un esempio concreto, ma credo che il componente adatto sia il TIdHTTP.

    Questo componente ha un metodo Get che consente di ricevere il contenuto (restituito dal server Web) dato un indirizzo.

    Il contenuto del file (di cui specifichi l'indirizzo) viene raccolto in un oggetto TStream (un discendente) che può successivamente salvarlo all'interno di un file su disco.

    Il componente supporta alcuni eventi (OnStatus, OnWork, OnWorkBegin, OnWorkEnd) che restituiscono informazioni sullo stato dell'operazione (ad esempio, i byte scaricati).

    Puoi sfruttare questi eventi per capire quanto del file è stato scaricato ed aggiornare in questo modo la tua interfaccia grafica (una ProgressBar) in modo appropriato.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    Ho utilizzato il componente che mi hai consigliato, ma sembra che il problema della determinazione della grandezza del file da scaricre rimanga. Ho visto anche gli eventi che mi consigliavi ma non sono riuscito a capire da dove tirare fuori la dimensione totale.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,301
    Suggerisco un'attenta lettura della Guida in linea.

    Ho creato una piccola applicazione in 5 minuti facendo così:
    ho inserito un componente TIdHttp sul form principale, più un pulsante per avviare il download del file.

    Per effettuare il download, ho scritto questo brevissimo codice.
    codice:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MS: TMemoryStream;
    begin
      MS := TMemoryStream.Create;
      try
        IdHTTP1.Get('http://www.abls.it/filename.txt', MS);
        MS.SaveToFile('C:\filename.txt');
      finally
        MS.Free;
      end;
    end;
    Il codice utilizza il metodo Get passando come parametro l'indirizzo del file da ricevere e un'istanza di TMemoryStream per copiare in memoria i dati ricevuti. Successivamente, con il metodo SaveToFile si provvede a salvare su disco il file ricevuto. Ora passiamo alla parte dello "stato del lavoro".

    Come avevo suggerito, gli eventi da intercettare sono OnWorkBegin e OnWork (l'evento OnWorkEnd si può utilizzare per segnalare il completamento del download, ad esempio).

    Questo è il codice dell'evento OnWorkBegin.
    codice:
    procedure TForm1.IdHTTP1WorkBegin(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCountMax: Integer);
    begin
      ProgressBar1.Max := AWorkCountMax;  
    end;
    Il valore massimo della ProgressBar viene inizializzato con il massimo valore assunto da WorkCount, che esprime il numero di byte scaricati e viene restituito dall'evento OnWork:
    codice:
    procedure TForm1.IdHTTP1Work(Sender: TObject; AWorkMode: TWorkMode;
      const AWorkCount: Integer);
    begin
      ProgressBar1.Position := AWorkCount;
    end;
    Nell'evento, durante il download, aggiorniamo lo stato della ProgressBar assegnando a Position il valore di AWorkCount.

    Il gioco è fatto...
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    18
    Scusami per l'insistenza. Il codice che mi hai postato l'avevo provato molte volte, solo che cercavo di scaricare una pagina web e la barra di caricamento mi mi andava avanti e indietro. Adesso ho fatto la prova con un file di tipo zip (che è quello che devo scaricare) e tutto funziona correttamente. Grazie. Ciao e scusami ancora.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.