Avatar billede hermandsen Juniormester
28. januar 2003 - 17:41 Der er 6 kommentarer og
2 løsninger

Url size, http download uden TFileStream og resumesupport på url.

Hejsa Eksperter!

Jeg er i gang med et program som bl.a. skal kunne hente filer fra nettet. Her er jeg stødt på følgende problemer:

- Hvordan bestemmer jeg størrelsen på filen uden at begynde at hente den først?

- Når jeg henter en fil (bruger Indy, TIdHTTP), så gør jeg det på følgende måde:

var
  fs: TFileStream;
begin
  fs := TFileStream.Create('C:\fil.zip', fmCreate);
  idHttp.Get('http://kilde.dk/fil.zip', fs);
end;

Så har jeg sat OnWork, OnBeginWork og OnEndWork for idHttp, og kan nu fint følge med i hvad der foregår vha. en progressbar. Mit TFileStream opretter en ny fil og lægger indholdet ned i den. Fint nok, men før den gør det fylder den hele filen med nuller. Det betyder at hvis jeg ønsker at hente en fil på f.eks. 100 MB med mit program, så skal programmet først skrive 100*1024*1024 nuller til harddisken før den kan begynde at downloade. Så er det pludselig ikke sjovt at hente filer og samtidig være i pladsmangel.

- Hvis jeg bliver smidt af mens jeg henter en fil, kunne det jo være rart at kunne genoptage downloadingen. Hvordan?

- Hvad gør jeg hvis brugeren ønsker at hente en fil fra en FTP-server?

Jeg ved at diverse downloadmanagers ikke har noget problem med sådanne ting, så er der nogen der kan forklare mig hvordan det hænger sammen?

Omkring at finde størrelsen på en URL har jeg selv fundet http://www.experts-exchange.com/Programming/Programming_Languages/Delphi/Q_20399561.html men med det første eksempel synes jeg det går for langsomt og i det andet er man afhængig af en DLL, som det ikke er sikkert at alle der skal bruge programmet har (WinInet).

Hvordan løser jeg så de problemer? :)

//hermandsen
Avatar billede stoney Nybegynder
28. januar 2003 - 20:10 #1
med indy

procedure TForm1.Button1Click(Sender: TObject);

begin

IdHTTP1.Head(edit1.Text);
label1.caption := 'Dato: '+ datetimetostr(IdHTTP1.Response.LastModified);
label2.Caption := 'Størrelse: ' + inttostr(IdHTTP1.response.ContentLength)+ ' byte';

  end;

Hvordan du resumer en afbrudt download ved jeg ikke.

Stoney
Avatar billede stoney Nybegynder
28. januar 2003 - 20:30 #2
Søgte lidt på nettet !!!!

Vedr. resume skal du kigge på
idhttp1.Response.ContentRangeEnd
idhttp1.Response.ContentRangeStart

Husk det er ikke alle servere der understøtter det.

Stoney
Avatar billede hermandsen Juniormester
28. januar 2003 - 20:34 #3
Kan jeg finde ud af om serveren understøtter det?
Avatar billede hermandsen Juniormester
28. januar 2003 - 20:36 #4
Jeg har kigget lidt på ContentRangeEnd og ContentRangeStart + TFileStream.Seek, men et problem er stadig at mit TFileStream fylder hele filen først!
Avatar billede stoney Nybegynder
28. januar 2003 - 20:48 #5
om serveren understøtter resume ?

You could do the following. This should work with servers which return
Accept-Ranges in the response header for items they support resuming for
(NB: be warned that not all resume-capable servers do this, though)...

function CanHttpServerResume(const aURL: string; aHttpClient: TIdHttp; var
aSize: Integer): Boolean;
begin
  try
    With aHttpClient do begin
      Head(aURL);
      Response.ProcessHeaders;
      aSize := Response.ContentLength;
      Result := (aSize > 0) and
        (Response.RawHeaders.Values['Accept-Ranges'] = 'bytes');
    end;
  except
    aSize := 0;
    Result := False
  end;
end;

Jeg kan ikke få det til at virke. Jeg bruger ver. 8.025 af Indy.

Vedr. ContentRangeEnd og ContentRangeStart, mon ikke du bare skal
tælle op under din download, gemme optællingen et sted og fortsætte
derfra næste gang du downloader.
Jeg er ikke sikker, men det er mit bedste bud.

Stoney
Avatar billede hermandsen Juniormester
28. januar 2003 - 20:54 #6
Jeg har fusket lidt med ContentRangeStart/End (før jeg oprettede dettet spørgsmål), og det ser sådan set også ud til at virke fint nok. Problemet dog stadig at der pludselig ligger en masse store filer på harddisken som egentlig kun er halvt færdige, men det er så nok et TFileStream-problem?
Avatar billede hermandsen Juniormester
02. februar 2003 - 22:47 #7
Du har stadig ikke en løsning på mit resume-problem? :)
Avatar billede hermandsen Juniormester
07. februar 2003 - 17:03 #8
Hmmm... Endnu ikke noget svar om resume... Jeg lukker spørgsmålet...

>>stoney
Tak for hjælpen indtil videre... Du får lidt point for dine andre svar! :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester