AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Funktion URLExists?
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion URLExists?

Ein Thema von PeterPanino · begonnen am 4. Aug 2007 · letzter Beitrag vom 5. Aug 2007
Antwort Antwort
Seite 1 von 2  1 2      
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#1

Funktion URLExists?

  Alt 4. Aug 2007, 02:12
Ich möchte mit JvHttpUrlGrabber und JvFtpUrlGrabber (beide aus der JEDI-VCL) eine Datei aus dem Internet herunterladen, was eigentlich gut funktioniert.

Wie kann ich jedoch vor dem Herunterladen feststellen, ob die zu herunterladendene Datei überhaupt existiert? (Für lokale Dateien gibt es ja die Funktion FileExists, aber für Dateien im Internet?). Wie könnte also eine Funktion URLExists aussehen?

Die beiden oben genannten Komponenten geben bei OnError nämlich keinen Fehler aus, wenn die angegebene URL nicht existiert. Sie laden bei einer nicht existierenden URL stattdessen ohne zu fragen einfach die "Fehler-404" Seite herunter!
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#2

Re: Funktion URLExists?

  Alt 4. Aug 2007, 02:52
Ich kenne die von dir genannten Klassen nicht - aber es ist nicht sonderlich schwierig eine Verbindung aufzubauen und den Response-Code zu checken. Anders wird es hier vermutlich nicht gehen. Ist bei HTTP einfacher als bei FTP - da musst du dich verbinden, in das Verzeichnis wechseln und dann z.B. die Größe der auf-Existenz-zu-prüfenden Datei abfragen. Gibt das einen Fehler, existiert die Datei nicht, oder dir fehlen die Rechte, um auf selbige zuzugreifen...

Für HTTP jedenfalls müsstest du einfach ein "GET /pfad/zur/seite.html HTTP/1.0"#13#10#13#10 schicken, wenn du 404 zurückbekommst, gibt es die Seite nicht. Da es aber viele Response-Codes gibt, musst du da auch genau schauen, was als OK gilt und was nicht. Alternativ könntest du zum Beispiel die ICS-HTTP-Komponente benutzen - die wirft eine Exception, wenn ein HTTP-Dokument nicht existiert.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Funktion URLExists?

  Alt 4. Aug 2007, 02:59
Zitat von wicht:
Ich kenne die von dir genannten Klassen nicht - aber es ist nicht sonderlich schwierig eine Verbindung aufzubauen und den Response-Code zu checken. Anders wird es hier vermutlich nicht gehen. Ist bei HTTP einfacher als bei FTP - da musst du dich verbinden, in das Verzeichnis wechseln und dann z.B. die Größe der auf-Existenz-zu-prüfenden Datei abfragen. Gibt das einen Fehler, existiert die Datei nicht, oder dir fehlen die Rechte, um auf selbige zuzugreifen...

Für HTTP jedenfalls müsstest du einfach ein "GET /pfad/zur/seite.html HTTP/1.0"#13#10#13#10 schicken, wenn du 404 zurückbekommst, gibt es die Seite nicht. Da es aber viele Response-Codes gibt, musst du da auch genau schauen, was als OK gilt und was nicht. Alternativ könntest du zum Beispiel die ICS-HTTP-Komponente benutzen - die wirft eine Exception, wenn ein HTTP-Dokument nicht existiert.
Hmm, danke vorerst mal, hört sich alles sehr kompliziert an. Präzisierung: Die gewünschte Funktion müsste sowohl bei HTTP als auch bei FTP funktionieren. Und es müsste nicht die Existenz einer Seite geprüft werden, sondern einer beliebigen Datei. Geht das?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Funktion URLExists?

  Alt 4. Aug 2007, 09:44
Guten Morgen,

hättest Du die Suche bemüht, hättest Du diesen Post vom marabu finden können.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#5

Re: Funktion URLExists?

  Alt 4. Aug 2007, 10:29
http://www.cryer.co.uk/brian/delphi/...isurlvalid.htm

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, WinINet;



function IsUrlValid(const url: string): boolean;
var
  hInet: HINTERNET;
  hConnect: HINTERNET;
  infoBuffer: array [0..512] of char;
  dummy: DWORD;
  bufLen: DWORD;
  okay: LongBool;
  reply: String;
begin
  hInet := InternetOpen(PChar(application.title),
    INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY,nil,nil,0);
  hConnect := InternetOpenUrl(hInet,PChar(url),nil,0,
    INTERNET_FLAG_NO_UI,0);
  if not Assigned(hConnect) then
    //----------------------------------------------------------
    // If we couldn't open a connection then we know the url
    // is bad. The most likely reason is that the url is bad,
    // but it could be because of an unknown or badly specified
    // protocol.
    //----------------------------------------------------------
    result := false
  else
  begin // Create a request for the url.
    dummy := 0;
    bufLen := Length(infoBuffer);
    okay := HttpQueryInfo(hConnect,HTTP_QUERY_STATUS_CODE,
      @infoBuffer[0],bufLen,dummy);
    if not okay then
      // Probably working offline, or no internet connection.
      result := False
    else
    begin
      reply := infoBuffer;
      if reply = '200then
      begin
        Form1.Memo1.Lines.Add('200');    // File exists, all ok.
        result := True; end
      else if reply = '401then
       begin
        Form1.Memo1.Lines.Add('401');    // Not authorised. Assume page exists,
                    // but we can't check it.
        result := True; end
      else if reply = '404then
       begin
        Form1.Memo1.Lines.Add('404');   // No such file.
        result := False; end
      else if reply = '500then
       begin
        Form1.Memo1.Lines.Add('500');   // Internal server error.
        result := False; end
      else
        // Shouldn't get here! It means there is
        // a status code left unhandled.
        result := False;
    end;
    InternetCloseHandle(hConnect);
  end;
  InternetCloseHandle(hInet);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if IsUrlValid('http://www.alcpu.com/CoreTemp/CoreTemp.zip') then
 Memo1.Lines.Add('CORETEMP.zip exists');
end;
(*
    HTTP_STATUS_OK                  200
    HTTP_STATUS_CREATED            201
    HTTP_STATUS_ACCEPTED            202
    HTTP_STATUS_NO_CONTENT          204
    HTTP_STATUS_MOVED_PERM          301
    HTTP_STATUS_MOVED_TEMP          302
    HTTP_STATUS_NOT_MODIFIED        304
    HTTP_STATUS_USE_PROXY          305
    HTTP_STATUS_BAD_REQUEST        400
    HTTP_STATUS_UNAUTHORIZED        401
    HTTP_STATUS_FORBIDDEN          403
    HTTP_STATUS_NOT_FOUND          404
    HTTP_STATUS_METHOD_NOT_ALLOWED  405
    HTTP_STATUS_PROXY_AUTH_REQRD    407
    HTTP_STATUS_LENGTH_REQUIRED    411
    HTTP_STATUS_SERVER_ERROR        500
    HTTP_STATUS_NOT_IMPLEMENTED    501
    HTTP_STATUS_BAD_GATEWAY        502
    HTTP_STATUS_SERVICE_UNAVAILABLE 503
    HTTP_STATUS_GATEWAY_TIMEOUT    504
    HTTP_STATUS_UNSUPPORTED_VERSION 505
*)
  Mit Zitat antworten Zitat
Benutzerbild von fkerber
fkerber
(CodeLib-Manager)

Registriert seit: 9. Jul 2003
Ort: Ensdorf
6.723 Beiträge
 
Delphi XE Professional
 
#6

Re: Funktion URLExists?

  Alt 4. Aug 2007, 10:31
Hi!

Dazu fällt mir doch spontan folgendes ein:

http://www.delphipraxis.net/internal...t.php?t=115256



Ciao, Frederic
Frederic Kerber
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: Funktion URLExists?

  Alt 4. Aug 2007, 11:23
@hathor
Zitat von hathor:
@Klaus01:

Deine Antwort ist off topic!
URLexists nützt ihm nichts - er will quasi ein URLFileExists...
Nein, sehe ich nicht so.

Sonst erklär mir bitte einmal den Unterschied zwischen der Routine vom marabu und der von Sakura.

Einen schönen Tag noch.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#8

Re: Funktion URLExists?

  Alt 4. Aug 2007, 19:41
Beide Funktionen

function UrlExists

function HTTPFileExists

bringen das gleiche Resultat, aber der Funktionsname HTTPFileExists ist aussagekräftiger...

z.B. in einer Suchfunktion.

Im Übrigen finde ich fast alle Hinweise auf eine Suchfunktion überflüssig !!!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: Funktion URLExists?

  Alt 4. Aug 2007, 20:26
Hallo,

ausgehend von Peters Beschreibung in Beitrag #1 würde ich eine Funktion UrlExists() etwa so entwerfen:

Delphi-Quellcode:
function UrlExists(const url: string): Boolean;
begin
  if AnsiStartsText('ftp', url) then
    Result := FTPExists(url)
  else
  if AnsiStartsText('http', url) then
    Result := HTTPExists(url)
  else
    raise Exception.Create(S_WRONG_URL);
  end;
end;
Ich würde beim HTTP-Protokoll nicht auf ein automatisches Redirection-Handling verzichten mögen. Beim FTP-Protokoll würde ich im Zielverzeichnis mittels LIST-Befehl prüfen, ob die gesuchte Datei existiert. Besonderes Augenmerk muss man dabei der Konfiguration der Komponenten TIdHTTP und TIdFTP widmen. Wenn UrlExists() universell einsetzbar sein soll, dann müsste noch ein Config-Record als zusätzlicher Parameter übergeben werden, aus dem man Proxy-Parameter u.ä. entnehmen kann.

Freundliche Grüße
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.465 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: Funktion URLExists?

  Alt 4. Aug 2007, 20:45
Zitat von hathor:
http://www.cryer.co.uk/brian/delphi/wininet/example_isurlvalid.htm
...
Vielen Dank an alle für die Tipps. Ich habe zum Testen zunächst mal das Beispiel von hathor gewählt, weil idHTTP (Indy) das Programm doch um sehr viele KBytes aufbläht; WinnINet hingegen scheint sehr "sparsam" zu sein.

Bei der Funktion IsUrlValid von hathor tritt folgender sehr seltsamer Fehler auf:

Dieser Aufruf ergibt True:
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/material/Skript/skript_Januar2006.pdf[/url]) Dieser Aufruf (1 falsches Zeichen im Dateipfad) ergibt jedoch auch True(!!):
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/material/Skript/skript_Januar2006.pdff[/url]) (ein f wurde an den Dateinamen angehängt)

Auch dieser Aufruf (2 falsche Zeichen im Dateipfad) ergibt True:
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/matemrial/Skript/skript_Januar2006.pdff[/url]) (zusätzlich ein m wurde in den Pfad eingefügt)

Der folgende Aufruf (3 falsche Zeichen im Dateipfad) ergibt jedoch Fehlercode 404:
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/matemmrial/Skript/skript_Januar2006.pdff[/url]) Das heißt also, bis zu 2 falsche Zeichen ergeben noch keinen Fehler! Warum? Bei anderen Servern jedoch ergibt schon 1 falsches Zeichen im Dateipfad einen Fehler. Warum?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:57 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