Hallo,
... und die dritte Möglichkeit ist, dass Du in der Datenbank nur den Link auf das Bild (also einen verweis auf seinen Speicherort = Pfad und Name) speicherst und trotzdem ein Skript zum Ausgeben des Bildes zwischenschaltest.
Warum?
Ganz einfach: alle Bilder, die direkt über einen <img src="bla"> Link erreichbar sind, können auch von "Unbefugten" von der Platte gesaugt werden. Du hast also keinerlei Kontrolle über die Zugriffe.
Mein Wunsch wäre es daher, die Bilder in einem für den "Normalsurfer" unzugänglichen Verzeichnis außerhalb der Document-Root zu speichern.
Thoralf Knuth hatte mir zu diesem Zwweck mal ein Skript gepostet. Ich gebe es einfach mal so wieder:
"------
Hallo Thomas,
ich poste Dir einfach mal ein Script, was ich seit einer Weile ohne Probleme verwende. Eigentlicher Zweck ist bei mir eine rudimentäre Referer-Kontrolle zur Traffic-Schonung, aber das sollte sich leicht auf Deine Bedürfnisse umstellen lassen.
Dabei ist /grafiken/versteckt/ per .htaccess gesperrt, kann aber natürlich auch ein Pfad ausserhalb der DOCROOT sein.
Ich hab die für Dich unwesentlichen Teile durch /* ... */ ersetzt. Alle entscheidenden Punkte sind vorhanden.
<?php
Standard-Aufruf: bild.php?bild=/grafiken/versteckt/bild.jpeg
error_reporting( E_ALL );
$DOCUMENT_ROOT = getenv( 'DOCUMENT_ROOT' );
$nicht_gefunden_pfad = $DOCUMENT_ROOT . '/images/404.jpg';
$falscher_referer_pfad = $DOCUMENT_ROOT . '/images/403.jpg';
$header_gif = 'Content-type: image/gif';
$header_jpeg = 'Content-type: image/jpeg';
$header_png = 'Content-type: image/png';
$HTTP_REFERER = getenv( 'HTTP_REFERER' );
$referer_ok = false;
$allowed_referers = array(
/* ... */
); # $allowed_referers = array(
Wurde ein Bild uebergeben?
if( ! isset( $bild ) OR $bild == '' )
{
header( $header_jpeg );
readfile( $nicht_gefunden_pfad );
return;
} # if( ! isset( $bild ) OR $bild == '' )
Soll der Referer gecheckt werden? Wenn denn einer vorhanden ist ;)
if( ! isset( $bild_php_kein_referer_check ) AND $HTTP_REFERER != '' )
{
/* Code, um den Referer zu checken */
}
else # if( ! isset( $bild_php_kein_referer_check ) )
{
$referer_ok = true;
}
Referer ok?
if( ! $referer_ok )
{
header( $header_jpeg );
readfile( $falscher_referer_pfad );
return;
} # if( ! $referer_ok )
$datei_uri = str_replace( '//', '/', '/vorgegebenes_verzeichnis/'. urldecode( $bild ) );
$datei_pfad = $DOCUMENT_ROOT . $datei_uri;
Gibt es das Bild?
if( ! file_exists( $datei_pfad ) )
{
header( $header_jpeg );
readfile( $nicht_gefunden_pfad );
return;
} # if( ! file_exists( $datei_pfad ) )
Korrekten Header senden
switch( strtolower( $datei_pi['extension'] ) )
{
case 'gif':
header( $header_gif );
break 1;
case 'png':
header( $header_png );
break 1;
case 'jpg':
case 'jpeg':
default:
header( $header_jpeg );
break 1;
} # switch
Letzte Aenderung durchreichen
if( ! isset( $last_modified ) OR $last_modified == '' )
{
$datei_zeit = filemtime( $datei_pfad );
header( 'Last-Modified: ' . gmdate( 'D, d M Y H:i:s', $datei_zeit ) . ' GMT' );
}
else
{
header( $last_modified );
}
Soll der korrekte Name zum Speichern mit angegeben weren? Eigentlich ja, aber zB bei naechster_hthumb.php nicht
if( ! isset( $bild_php_dont_give_name ) )
{
header("Content-Disposition: attachment; filename="" . basename( $datei_pfad ) . """);
}
readfile( $datei_pfad );
return;
?>
Gruss, Thoralf
-----" (Zitat Ende)
Ich hoffe, es nützt Dir auch. Ich habs selber leider noch nicht angefasst, aber mein Nachwuchskollege meint, es geht super.
Grüße
Tom