![]() |
Funktion URLExists?
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! |
Re: Funktion URLExists?
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. |
Re: Funktion URLExists?
Zitat:
|
Re: Funktion URLExists?
Guten Morgen,
hättest Du die Suche bemüht, hättest Du diesen ![]() Grüße Klaus |
Re: Funktion URLExists?
![]()
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 = '200' then begin Form1.Memo1.Lines.Add('200'); // File exists, all ok. result := True; end else if reply = '401' then begin Form1.Memo1.Lines.Add('401'); // Not authorised. Assume page exists, // but we can't check it. result := True; end else if reply = '404' then begin Form1.Memo1.Lines.Add('404'); // No such file. result := False; end else if reply = '500' then 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 *) |
Re: Funktion URLExists?
Hi!
Dazu fällt mir doch spontan folgendes ein: ![]() Ciao, Frederic |
Re: Funktion URLExists?
@hathor
Zitat:
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 |
Re: Funktion URLExists?
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 !!! |
Re: Funktion URLExists?
Hallo,
ausgehend von Peters Beschreibung in Beitrag #1 würde ich eine Funktion UrlExists() etwa so entwerfen:
Delphi-Quellcode:
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.
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; Freundliche Grüße |
Re: Funktion URLExists?
Zitat:
Bei der Funktion IsUrlValid von hathor tritt folgender sehr seltsamer Fehler auf: Dieser Aufruf ergibt True:
Delphi-Quellcode:
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.pdf[/url])
Delphi-Quellcode:
(ein f wurde an den Dateinamen angehängt)
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/material/Skript/skript_Januar2006.pdff[/url])
Auch dieser Aufruf (2 falsche Zeichen im Dateipfad) ergibt True:
Delphi-Quellcode:
(zusätzlich ein m wurde in den Pfad eingefügt)
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/matemrial/Skript/skript_Januar2006.pdff[/url])
Der folgende Aufruf (3 falsche Zeichen im Dateipfad) ergibt jedoch Fehlercode 404:
Delphi-Quellcode:
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?
IsUrlValid([url]http://www.uni-muenster.de/Jura.itm/hoeren/matemmrial/Skript/skript_Januar2006.pdff[/url])
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz