Bilder von fremden Server einbinden
diplomsiedler
- php
Hallo,
ich binde über eine Datenbank Bilder von einem fremden Server ein.
Mein Problem ist, dass diverse Bilder nicht vorh. sind. Ich möchte nun, eine Abfrage basteln, die dies bei Abruf prüft und gegebenfalls
ein Blindgif ausliefert. Gibts da ne' Standdardlsg.?
Danke im Voraus,
diplomsiedler
Halihallo dipl.siedl.
ich binde über eine Datenbank Bilder von einem fremden Server ein.
Mein Problem ist, dass diverse Bilder nicht vorh. sind. Ich möchte nun, eine Abfrage basteln, die dies bei Abruf prüft und gegebenfalls
ein Blindgif ausliefert. Gibts da ne' Standdardlsg.?
Keine mir bekannte. Ich würde vorschl. mal google.de zu besuchen. Über eine serverseitige
Lsg. ist dies u. U. einfach zu lsgen. Such'm nach 404-er HTTP-Status-C, wenn ja, dann
ggf. dein Bildgif auslfrn. Prl/PH (od. andre s.s.p) vorausg.
perldoc LWP::Simple
perldoc CGI
Viele Grüsse
Philipp
PS: Ich hoffe, dass du meine kommunikative Faulheit (a.k.a Abk.) genauso störend
findest, wie ich die deinige; denn dann habe ich gleich zwei Probleme auf
einmal gelöst.
Pech gehabt. Mein Provider hat die Variable allow_url_fopen in PHP auf 'Off' gesetzt. Dies verhindert den Zugriff auf URL's mit include() und fopen(). -> Ich kann die Abfrage nicht machen. :(
diplomsiedler
Halihallo diplomsiedler
Pech gehabt. Mein Provider hat die Variable allow_url_fopen in PHP auf 'Off' gesetzt. Dies verhindert den Zugriff auf URL's mit include() und fopen(). -> Ich kann die Abfrage nicht machen. :(
Auch wenn dieser Wrapper deaktiviert ist, kannst du über Sockets "manuell" die Ressource
öffnen. Bei nichtexistieren des Objektes (also dein gesuchtes Bild) liefert dir der
fremde Webserver ein Status: 404; auf diesen Status kannst du prüfen und ein alternatives
Bild ausgeben. Mehr dazu siehe mein anderes Posting mit den Stichwörtern.
In http://www.php.net stehen im betreffenden Kapitel oder Befehlsreferenz einige
Beispiele. Suche z. B. nach fsockopen.
Viele Grüsse
Philipp
In http://www.php.net stehen im betreffenden Kapitel oder Befehlsreferenz einige
Beispiele. Suche z. B. nach fsockopen.
Bekomme ich leider nicht hin.
diplomsiedler
Bekomme ich leider nicht hin.
diplomsiedler
hm, schade, ich dachte es hilft mir jemand weiter.
diplomsiedler
Halihallo diplomsiedler
Bekomme ich leider nicht hin.
diplomsiedler
hm, schade, ich dachte es hilft mir jemand weiter.
Du hast keine Rückfrage gestellt. Geholfen wird hier ohne Frage nicht und ein fertiges
Programm wird dir wohl auch niemand liefern. Hast du eine konkrete Frage oder eine
konkrete Fehlermeldung bei der Umsetzung meiner Ratschläge, dann poste diese.
Viele Grüsse
Philipp
ich dachte, dass hätte ich schon.
ich nix wissen, wie mit hilfe von fsockopen den 404er check machen kann, wie du zuvor beschrieben hast?!
gruß, diplomsiedler
Halihallo diplomsiedler
ich dachte, dass hätte ich schon.
Nun, "Bekomme ich nicht hin" klingt mir nicht nach einer Frage und zeugt von höchster
ungedult und unbereitwilligkeit das Problem auch _selber_ anzugehen.
ich nix wissen, wie mit hilfe von fsockopen den 404er check machen kann, wie du zuvor beschrieben hast?!
_Das_ ist eine Frage. Unter http://www.php.net/manual/de/function.fsockopen.php
findest du dieses Beispiel:
<?php
$fp = fsockopen ("www.example.com", 80, &$errno, &$errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fputs ($fp, "GET / HTTP/1.0\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp,128);
}
fclose($fp);
}
?>
Dieses Stellt eine Verbindung mit www.example.com her (die du bitte durch den Server
mit dem fremden Bild ersetzt) und öffnet '/' (also in den meisten Fällen /index.html)
für dein Beispiel: fputs ($fp, "GET /images/existiert.gif HTTP/1.0\r\n\r\n");
dann wird versucht die Ressource http://www.example.com/images/existiert.gif zu laden.
das was dort über echo fgets($fp,128); ausgegeben wird, kannst du in eine Variable
"umleiten" (du möchtest nicht auf dem Bildschirm lesen, was der fremde Server antwortet,
sondern du möchtest wissen, ob da ein "Status: 404" drinne steht, dazu musst du die
Ausgabe in einer Variablen speichern):
$response .= fgets($fp,128);
Nun, wo steht nun der gewünschte "Status: 404 ..."? - Der wird vom Webserver _in_ dieser
$response gespeichert. Nun stellt sich natürlich die Frage, wie du diesen Status-Code
extrahieren kannst. Hierzu möchtest du dich über RegularExpressions informieren, dies
tust du z. B. unter http://www.php.net/manual/de/function.preg-match.php.
Sieh dir z. B. dort das Beispiel 3 "Getting the domain name out of a URL" an und passe
es etwa so an:
preg_match("/Status: (.*?)(\r|\n)$/i",$host,$matches);
in $matches[0] hast du dann entweder '404', das heisst "Ressource nicht gefunden", das
fragliche Bild befindet sich also _nicht_ auf dem fremden Server, oder du hast z. B.
'200' was ein 'OK' bedeutet (die Ressource [=>Bild] ist vorhanden); natürlich gibt's
noch viele andere HTTP-Status-Codes, die du bitte über google.ch nachschlägst.
Viele Grüsse
Philipp
Hallo Philipp,
vielen Dank für Deine ausführliche Erklärung. Ich denke, dass ich dass nun geschnallt habe. Leider habe ich mich vorher aus dem Konzept bringen lassen, da der Server, den ich angesprochen habe, die Anfrage scheinbar nicht zulässt.
Ich bekomme bei der Beispielsanfrage immer die Meldung:
Warning: fsockopen() [function.fsockopen]: php_hostconnect: connect failed in [...] on line 2
Warning: fsockopen() [function.fsockopen]: unable to connect to www.[...].de:80 in [...] on line 2
Connection timed out (110)
:( Der will wohl nicht.
Gruß,
Marc
Halihallo diplomsiedler
vielen Dank für Deine ausführliche Erklärung. Ich denke, dass ich dass nun geschnallt habe. Leider habe ich mich vorher aus dem Konzept bringen lassen, da der Server, den ich angesprochen habe, die Anfrage scheinbar nicht zulässt.
Dann ist er entweder kein Webserver, ist down, oder du machst etwas falsch... ;)
Ich bekomme bei der Beispielsanfrage immer die Meldung:
Dann zeig uns bitte die Beispielsanfrage. Die Fehler kommen nicht einfach so, es gibt
immer einen Grund dafür und dieser steht mit einer Wahrscheinlichkeit von ca. 60% in
_deinem_ Code.
Warning: fsockopen() [function.fsockopen]: unable to connect to www.[...].de:80 in [...] on line 2
Connection timed out (110)
Hast du fsockopen( 'http://www.[...].de', 80 ) ?
a) das "http://" ist _wichtig_
b) der Port wird als Parameter übergeben
c) du hast auch einen 'Host: www.[...].de' Header gesendet?
Also: Zeig uns bitte den Code-Abschnitt, der die Verbindung herstellt und Daten
sendet/empfängt.
Viele Grüsse
Philipp
Also: Zeig uns bitte den Code-Abschnitt, der die Verbindung herstellt und Daten
sendet/empfängt.
Okay, hier ein Beispiel für meine test.php Datei:
<?php
$fp = fsockopen ('http://www.spielenet.de', 80, &$errno, &$errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp,128);
}
fclose($fp);
}
?>
diplomsiedler
Halihallo diplomsiedler
Also: Zeig uns bitte den Code-Abschnitt, der die Verbindung herstellt und Daten
sendet/empfängt.Okay, hier ein Beispiel für meine test.php Datei:
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
Die Angabe "Host:" _muss_ bei Servern mit, da der Webserver sonst die gewünschte Domain
nicht auflösen kann (die Domain bei fsockopen kriegt er nämlich gar nicht mit, die
dient nur dazu, dass PHP weiss, wohin es "Verbinden" soll)
Funktioniert's damit?
Viele Grüsse
Philipp
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
So?
<?php
$fp = fsockopen ('http://www.spielenet.de', 80, &$errno, &$errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp,128);
}
fclose($fp);
}
?>
gibt auch nen' Fehler. :(
diplomsiedler
Halihallo diplomsiedler
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
So?
[...]
Ja, so sollte es funktionieren, aber...
gibt auch nen' Fehler. :(
... anscheinend doch nicht? - Wenn du hilfe benötigst, musst du schon eine Fehlermeldung
angeben, raten können wir nicht.
Ich habe es gestern auch kurz ausprobiert, auch bei mir kamen Fehler. Er kann den
Domainnamen einfach nicht in eine IP auflösen, ich verstehe das leider nicht.
<quote>
Warning: fsockopen() [function.fsockopen]: php_network_getaddresses: gethostbyname failed in D:\Intranet\Admazing\t.php on line 2
Warning: fsockopen() [function.fsockopen]: unable to connect to http://spielenet.de:80 in D:\Intranet\Admazing\t.php on line 2
0 (Der Vorgang wurde erfolgreich beendet. )
</quote>
für
<quote>
<?php
$fp = fsockopen ('http://spielenet.de', 80, &$errstr, &$errno);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
fputs ($fp, "Host: spielenet.de\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp,128);
}
fclose($fp);
}
?>
</quote>
auch ein www. vor der SLD bringt nichts.
Viele Grüsse
Philipp
Hallo Philipp,
<?php
$fp = fsockopen ('http://spielenet.de', 80, &$errstr, &$errno);
Das http:// darf da nicht sein! fsockopen erwartet einen _Hostnamen_, keine _Adresse_. Danach sollte das klappen. Das kommt davon, wenn man sich zuviel mit Perl beschäftigt. ;-)
Viele Grüße,
Christian
Halihallo Christian
<?php
$fp = fsockopen ('http://spielenet.de', 80, &$errstr, &$errno);Das http:// darf da nicht sein! fsockopen erwartet einen _Hostnamen_, keine _Adresse_. Danach sollte das klappen.
Au waya! - Danke!
Das kommt davon, wenn man sich zuviel mit Perl beschäftigt. ;-)
Daaaas hat nixx mit der Perle zu tun, du! :-)
Viele Grüsse und Danke
Philipp
funzen tuts aber dennoch nicht. :(
marc
Halihallo diplomsiedler
funzen tuts aber dennoch nicht. :(
<?php
$fp = fsockopen ('www.spielenet.de', 80, &$errno, &$errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
fputs ($fp, "GET /images/01417801.gif HTTP/1.0\r\n");
fputs ($fp, "Host: www.spielenet.de\r\n\r\n");
while (!feof($fp)) {
echo fgets($fp,128);
}
fclose($fp);
}
?>
Verbindung wird bei mir hergestellt.
Viele Grüsse
Philipp
Halihallo diplomsiedler
Verbindung wird bei mir hergestellt.
Bei mir nicht. Ich bin meinem Provider auch bald leid. Im Juni kommt ein eigener Server und dann ist Schluss mit den vielen Einschränkungen.
Danke und Gruß,
diplomsiedler
Halihallo diplomsiedler
ich binde über eine Datenbank Bilder von einem fremden Server ein.
Mein Problem ist, dass diverse Bilder nicht vorh. sind. Ich möchte nun, eine Abfrage basteln, die dies bei Abruf prüft und gegebenfalls
ein Blindgif ausliefert. Gibts da ne' Standdardlsg.?
Aha, Themenbereich PHP... Dachte das sei eine Abk. für Programming HTML Person, sorry.
---
$fp = @fopen("http://www.fremde-domain.de/images/existiert_nicht.jpg","r");
if ($fp)
{
echo "Okidoki, existiert, also dieses ausliefern => Location: - HTTP-Header..."
} else {
/* tjö... Bild existiert nicht, oder Server down, oder, oder...
also halt ein fall-back-Bild'schen ausgeben oder so... */
}
naja, eine ziemlich missratene Umsetzung, aber funktional... Für eine bessere Lösung
informiere dich über HTTP-Status-Codes, Sockets und die HEAD-Methode. Google und/oder
das Archiv wird dir behilflich sein.
Viele Grüsse
Philipp