PDA

Visualizza la versione completa : [DELPHI] Download file


Alterisi
15-09-2003, 13:59
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;

alka
15-09-2003, 14:04
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?

Alterisi
15-09-2003, 14:21
No, perchè non saprei proprio come utilizzarli! Se non è troppo lungo potresti darmi qualche dritta? Grazie.

alka
15-09-2003, 15:19
Hai già provato a guardare sul sito ufficiale della Nevrona Designs (http://www.indyproject.org/).

Ciao! :ciauz:

Alterisi
16-09-2003, 10:16
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.

alka
16-09-2003, 10:37
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! :ciauz:

Alterisi
16-09-2003, 22:34
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.

alka
16-09-2003, 23:07
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.


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.


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:


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...

Alterisi
16-09-2003, 23:29
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.

Loading