Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Prüfen ob Datei online (https://www.delphipraxis.net/168452-pruefen-ob-datei-online.html)

Codewalker 22. Mai 2012 09:40

Prüfen ob Datei online
 
Wie würdet ihr am sinnvollsten prüfen, ob eine Datei unter einer gegebenen URL zum Download bereit stünde? Ich will die Datei nicht herunterladen, sondern so einfach uns schnell wie möglich ein einfaches "Ja/Nein"-Ergebnis. Mein Ansatz wäre bisher, einfach zu versuchen, den Download zu starten. Gibt es da eine bessere Möglichkeit (sowas würde ja z.B. auch einen Downloadzähler in Foren erhöhen, etc.)?

jfheins 22. Mai 2012 09:42

AW: Prüfen ob Datei online
 
wie wäre es mit einem http head request?
mfg vom handy

Codewalker 22. Mai 2012 09:45

AW: Prüfen ob Datei online
 
Jau, das klingt gut :thumb:. Ich knobel dann mal, das sauber in Delphi umzusetzen (wenn da jemand Ideen oder Ansätze hat, bin ich ganz Ohr)

win568 22. Mai 2012 09:58

AW: Prüfen ob Datei online
 
Kleines Snippet

Code:
function CheckUrl(url:string):Boolean;
var hSession, hfile: hInternet;
    dwindex,dwcodelen :dword;
    dwcode:array[1..20] of char;
    res : pchar;
begin
  Result := FALSE;
  if Pos('http://',lowercase(url)) = 0 then begin
    url := 'http://'+url;
  end;
  hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG,NIL, NIL, 0);
  if Assigned(hsession) then begin
    hfile := InternetOpenUrl(hsession, PCHAR(url), NIL, 0, INTERNET_FLAG_RELOAD, 0);
    dwIndex := 0;
    dwCodeLen := 10;
    HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode, dwcodeLen, dwIndex);
    res := pchar(@dwcode);
    Result:= (res ='200') or (res ='302');
    if Assigned(hfile) then begin
      InternetCloseHandle(hfile);
    end;
    InternetCloseHandle(hsession);
  end;
end;

Codewalker 22. Mai 2012 11:04

AW: Prüfen ob Datei online
 
Eingebaut, getestet: Funktioniert wunderbar :thumb:
Ich hatte mich schon bei IPWorks und Indy umgesehen, aber so ist natürlich noch besser. Wäre das nicht was für die CodeLib?

DeddyH 23. Mai 2012 10:41

AW: Prüfen ob Datei online
 
Meine Variante sieht so ähnlich aus, bietet aber auch einen TimeOut an:
Delphi-Quellcode:
function IsUrlValid(const sUrl: string; CheckTimeout: DWORD = 3000): Boolean;
var
  hInet, hConnect: HINTERNET;
  StatusCode, dummy, bufLen, Option: DWORD;
begin
  Result := False;
  hInet := InternetOpen(PChar(Application.Title),
    INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, nil, nil, 0);
  if Assigned(hInet) then
    try
      Option := CheckTimeout;
      InternetSetOption(hInet, INTERNET_OPTION_CONNECT_TIMEOUT, @Option,
        SizeOf(Option));
      InternetSetOption(hInet, INTERNET_OPTION_RECEIVE_TIMEOUT, @Option,
        SizeOf(Option));
      hConnect := InternetOpenUrl(hInet, PChar(trim(sUrl)), nil, 0,
        INTERNET_FLAG_NO_UI, 0);
      if Assigned(hConnect) then
        try
          dummy := 0;
          bufLen := SizeOf(StatusCode);
          if HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or
            HTTP_QUERY_FLAG_NUMBER, @StatusCode, bufLen, dummy) then
            // Statuscode 200 = alles OK
            Result := StatusCode = 200;
        finally
          InternetCloseHandle(hConnect);
        end;
    finally
      InternetCloseHandle(hInet);
    end;
end;

Codewalker 23. Mai 2012 11:54

AW: Prüfen ob Datei online
 
Könnte man nicht gleichzeitig auch noch die Dateigröße ermitteln? Also Rückgabewert als integer und -1 zurückgeben wenn offline?

Zacherl 23. Mai 2012 12:04

AW: Prüfen ob Datei online
 
Zitat:

Zitat von Codewalker (Beitrag 1167701)
Könnte man nicht gleichzeitig auch noch die Dateigröße ermitteln? Also Rückgabewert als integer und -1 zurückgeben wenn offline?

Das dürfte mit HTTP_QUERY_CONTENT_LENGTH statt HTTP_QUERY_STATUS_CODE gehen, aber beachte, dass nicht alle Webserver bzw. Skripte den "Content-Length" Header senden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz