Thoralf Knuth: Bilder auf der Platte, oder in die Datenbank laden?

Beitrag lesen

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