Entwickler-Ecke
Internet / Netzwerk - Prüfen ob Datei auf Server existiert
Nano-Ware - Sa 05.12.09 20:04
Titel: Prüfen ob Datei auf Server existiert
Hi,
sry wenn das das jetzt die falsche Kategorie ist^^
also:
Mein Problem ist:
- Ich will prüfen, ob eine Datei auf einem Server vorhanden ist.
- Der Server ist der Imageserver von Youtube.
- Die Datei ist ein Bild
Ich möchte schaun, ob das Bild existiert. Es kann auch sein, dass evtl. der Server nicht existiert.
Das sind die Server, auf denen die Bilder liegen könnten:
Es könnte ja sein, dass Youtube auch irgendwann einmal noch Server hinzufügt, deshalb prüft er auch auf i5,i6,i7,i8,i9 und i10
Deshalb die Frage:
Gibt es eine Funktion, mit der man testen kann, ob eine Datei auf einem Server existiert, die aber auch funktioniert, wenn der Server bzw irgendein Unterordner nicht vorhanden ist?
Vielen Dank schon jetzt
PS: Ich bin noch ein Anfänger, aber die Grunderfahrung habe ich^^
Bob Murphy - Sa 05.12.09 20:20
Du könntest mit den Indys (IdHTTP) testen ob der Server erreichbar ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| try IdHTTP.Get('http://i1.ytimg.com/PFAD ZUM IMAGE'); except end; |
Das ganze kannste dann in eine repeat Schleife packen, die dann alle Server durchgeht
Nano-Ware - Sa 05.12.09 20:31
Also wenn das Bild nicht vorhanden ist würde ein Fehler kommen, der wird abgefangen und dann gemerkt, ob die Datei vorhaden ist..^^ so einfach?
thx
PS: Weil ich angeschrieben wurde: Ich bin Delphi2009lover und hab mich umbenannt, weil ich einen neuen Namen wollte, weil ich ich jetzt Delphi 2010 hab :wink:
Bob Murphy - Sa 05.12.09 20:36
aber den pfad zur datei kennst du ja?
Nano-Ware - Sa 05.12.09 20:40
Ja
Bob Murphy - Sa 05.12.09 20:53
gut, dann kannst du es so machen, einfach eine repeat schleife in der mit idhttp überprüft wird ob die datei vorhanden ist. den vorgang wiederholst du solange bis die datei auf einen server gefunden wurde.
Nano-Ware - Sa 05.12.09 21:20
Leider funktioniert es doch nicht...
hier der Code:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| try
HT.Get('http://i4.ytimg.com/vi/KWJuDguYFIM/default.jpg'); Edit1.Text := 'OK';
except
Edit1.Text := 'NOT OK';
end;
try
HT.Get('http://i4.ytimg.com/vi/KWJuDguYFIM/default23456789.jpg'); Edit2.Text := 'OK';
except
Edit2.Text := 'NOT OK';
end;
try
HT.Get('http://i47777777.ytimg.com/vi/KWJuDguYFIM/default.jpg'); Edit3.Text := 'OK';
except
Edit3.Text := 'NOT OK';
end; |
Wobei der 1. Link zu 100% geht. Warum zeigt er dann not ok an?
Bob Murphy - So 06.12.09 09:39
so solltest du das auch nicht machen, ich poste dir mal meinen code mit dem ich immer in meinen programmen überprüfe ob internet verfügbar ist. der code passt zwar nicht 100% auf dein problem, aber sollte kein problem sein das ein wenig umzuschreiben.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37:
| function CheckInternet: Boolean; var i: Integer; http: TIdHTTP; const Service: array[0..5] of string = ( 'http://www.google.com/', 'http://www.myspace.com/', 'http://www.facebook.com/', 'http://www.ebay.com/', 'http://www.microsoft.com/', 'http://twitter.com/'); begin Result := false;
http := TIdHTTP.Create(nil); http.HandleRedirects := true; i := 0;
try repeat try http.Get(Service[i]); Result := true; except i := i + 1; end;
if i = 6 then begin i := 0; end; until (Result = true); finally http.Free; end; end; |
jaenicke - So 06.12.09 11:05
Wozu denn gleich das Bild herunterladen? Es reicht doch den Header abzurufen, es sollte dann ein 404 zurückkommen, wenn die Datei nicht existiert.
Nano-Ware - So 06.12.09 11:33
Gibt der auch 404 zurück wenn der Server nicht existiert?? Weil ich hätte gedacht, dass dann nur wieder Fehler kommen.
@Bob Murphy sry die Idee von Jaenicke ist besser :wink: weil deine Methode dauert schon recht lange... also Herr Jaenicke, wie soll ich das machen? Also wie ruf ich "Header" auf? Ich hab damit noch nie gearbeitet, ich weiß nur, dass es das gibt xD
Andreas L. - So 06.12.09 12:24
Nano-Ware - So 06.12.09 12:38
Also ich wills jetzt verstehen^^ was gibt head denn eigentlich zurück?
Den Text zwischen <TITLE> und </TITLE>?
Nano-Ware - So 06.12.09 15:16
Sry was macht dann bitte die Procedure Head?
Niko S. - So 06.12.09 15:48
Das hat doch Andreas geschrieben.
Schau dir mal IdHTTP.Response an dort findest du so einiges.
Nano-Ware - So 06.12.09 20:55
Ich habs mit angeschaut, aber ich habe keine Ahnung, wie man diese Procedure aufruf und den Wert ausließt
Nano-Ware - So 06.12.09 21:35
Ich meinte das mit dem Response^^
Also wie ich das lösen muss^^
Ich hab keine Ahnung, wie das geht, wenn ich einfach:
IDHTTP1.Head(URL);
schreib zuckt sich das Programm mehrere Minuten nicht, bis ich es dann aufgebe
jaenicke - So 06.12.09 22:27
Ich habe keine Ahnung was du machst, bei mir klappt das problemlos. :nixweiss:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| var HttpLoader: TIdHttp; begin HttpLoader := TIdHttp.Create; try HttpLoader.Head('http://i4.ytimg.com/vi/KWJuDguYFIM/default.jpg'); if HttpLoader.ResponseCode = 200 then memResult.Lines.Add('erfolgreich'); finally HttpLoader.Free; end; |
Nano-Ware - Mo 07.12.09 09:14
Ich glaub ich habs etwas falsch geschrieben
ich habe den Code etwas verändert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm6.Button1Click(Sender: TObject); var HttpLoader: TIdHttp; begin HttpLoader := TIdHttp.Create; try HttpLoader.Head(Edit1.Text); if HttpLoader.ResponseCode = 200 then memResult.Lines.Add('erfolgreich'); finally HttpLoader.Free; memResult.Lines.Add('Finish'); end; end; |
wenn ich jetzt wie beschrieben das:
http://i4.ytimg.com/vi/KWJuDguYFIM/default.jpg "teste" gibt er erfolgreich aus, das ist schonmal gut, bei mir ging das nich so.
Das Problem ist ja, dass ich schauen will, ob eine Datei existiert, wenn ich jetzt nämlich im Edit
http://i4.ytimg.com/vi/KWJuDguYFIM/default.jp eingebe (also eine Datei, die nicht existiert) macht das Programm überhaupt nichts. Es bleibt dann einfach hängen
PS: Schaut euch mal auch den falschen Youtubelink im Browser an, denn da wird keine Error 404 Seite z.B. angezeigt sondern ein Bild
EDIT:// Das gleiche passiert übrigends auch wenn ich
http://www.google.de eingebe, wobei ich immer gedacht hab die Seite existiert :wink:
EDIT2:// Ich hab den Code jetzt so abgeändert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm6.Button1Click(Sender: TObject);
begin
try IdHTTP1.Head(Edit1.Text); if IdHTTP1.ResponseCode = 200 then memResult.Lines.Add('erfolgreich'); except
memResult.Lines.Add('nope'); end; end; |
Er reagiert genau so wie der andere. Wenn ich z.B.
http://www.google.de eingebe (im Edit) dann dauerts 5 Minuten, dann gibt er "nope" aus, genauso wie bei dem falschen Youtubelink (*.jp) da dauerts auch sehr lange... Wenn ich aber den richtigen eingebe, erscheint innerhalb von ca 2 Sekunden "erfolgreich" woran liegt das jetzt???
ffgorcky - Mo 07.12.09 22:04
Bei jeder aufgerufenen Haupt-Webseite schreibt der Browser automatisch /index.html dahinter.
Also versuche mal die Seite
http://www.Google.de/index.html.
Dann müsste das klappen.
jfheins - Mo 07.12.09 22:07
ffgorcky hat folgendes geschrieben : |
Bei jeder aufgerufenen Haupt-Webseite schreibt der Browser automatisch /index.html dahinter.
Also versuche mal die Seite http://www.Google.de/index.html.
Dann müsste das klappen. |
Das ist quark.
Aber wenn ein verzeichnis aufgerufen wird, guckt der server nach ob da ne index.html (oder .htm .php - ist einstellbar) drin ist und liefert die stattdessen aus
Als Problemlösung: Kannst du vll. einstellen dass er redirects folgen soll oder sowas?
elundril - Di 08.12.09 03:13
oder vielleicht is es das fehlende "http://" vor dem "www.google.de"?
lg elundril
Nano-Ware - Di 08.12.09 11:06
Nein, ich hab extra eine Funktion geschrieben, die egal wie der URL geschrieben wird immer
http://www.google.de z.B. daraus macht.
PS: Liegts vllt an Delphi 2010?
JoelH - Di 08.12.09 14:36
Die Indykomponenten haben meinen Gefühl nach einen Hang zum einfrieren wenn sie auf ein Ergebnis warten. Aber ein kleiner Workaround, setzt mal ein
Delphi-Quelltext
1:
| Idhttp1.ReadTimeout := 5000; |
vor deinen Aufruf, damit wird die Komponente angewiesen nach 5000 Millisekunden abzubrechen. Diese Zeit sollte normalerweise ausreichen um von einem Webserver einen Antwort zu erhalten. Wenn das nicht der Fall ist kann man davon ausgehen, dass die Seite nicht in dieser URL-Form existiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!