Sonntag, 14. März 2010

Bilder von fremden Webseiten grabben

Ist jemand zu Hause?

PHP bietet die Möglichkeit über den Tellerrand des eigenen Servers zu blicken - im konkreten Fall wollen wir dies nutzen um Bilder von einem fremden Webserver zu zu kopieren.

Wir bauen uns eine überraschend einfache Funktion mit der wir den gewünschten Inhalt holen (file_get_contents) und in eine Datei schreiben (file_put_contents). Schon haben wir die fremde Grafik zu unserer Verfügung und könnten sie weiter verarbeiten.

holeBild('http://www.domain.nan/Bilder/Blume.jpg', 'bild.jpg');

function holeBild($Url, $Bild)
{
    file_put_contents( $Bild, file_get_contents($Url) ); 
}
Leider ist dieser direkte und einfache Zugriff auf fremde Inhalte nicht auf jedem Webspace erlaubt. In diesen Fällen ist manchmal der Zugriff auf ein Tool namens CURL eingerichtet. CURL bietet mehr Sicherheit und nebenbei auch eine Vielzahl weiterer Optionen. Wir interessieren uns aber diesmal nur für unsere Bilder.
holeBildCurl('http://www.domain.nan/Bilder/Blume.jpg', 'curl.jpg');

function holeBildCurl($Url, $Bild)
{
    $CURLHandle = curl_init($Url); 
    $DateiHandle = fopen($Bild, 'wb'); 
    
        curl_setopt($CURLHandle, CURLOPT_TIMEOUT, 3);
        
        curl_setopt($CURLHandle, CURLOPT_FILE, $DateiHandle); 
        curl_setopt($CURLHandle, CURLOPT_HEADER, 0); 
        curl_exec($CURLHandle); 
        curl_close($CURLHandle); 
        
    fclose($DateiHandle);
    
    return;
}
Um zu verhindern, dass das Programm abbricht falls ein Server nicht erreichbar oder ein Bild nicht vorhanden ist, setzen wir die Option TIMEOUT auf (beispielsweise) 3 Sekunden. Nach dieser Zeit wird die altuelle Operation mit CURL beendet, das Programm aber regulär weiter ausgeführt. Weitere Informationen zu CURL finden Sie auf php.net.

Ein Hinweis: Auch wenn durch einen Timout ein Abbruch verhindert werden kann, wenn ein Bild nicht vorhanden oder nicht erreichbar ist, wird ein vorhandenes lokales Bild dennoch überschrieben, bzw. es wird ein Bild mit 0-Grösse erstellt.
Wer hier sauber arbeiten will, sollte das zu herunterladende Bild unter einem temporären Namen laden und erst nach einer Prüfung umbenennen.

Keine Kommentare:

Kommentar veröffentlichen