Fabienne: "Bildschleuse" für pdf, doc, ppt ???

Gibt es eine Möglichkeit nicht nur Bilder via "Bildschleuse" an den Client zu schiecken? Der $pfadzumbild wird an die Datei Bildschleuse übergeben, danach wird ein Usercheck durchgeführ und anschließend soll die Bilddatei aus einem Ordner, der sich nicht auf dem http-Server befindet, an den Client geschickt werden.

Das ganze sollte nur auch mit pdf, doc, ppt usw. funzen. Hat jemand ne Idee??
Unten das Script (auch hier aus dem Forum von Thomas //Danke hier nochmals) für die "reine" "Bilder"-schleuse:

<?php

unset($pfadzumbild); // Zur Sicherheit, falls register_globals on ist...

if (file_exists($pfadzumbild)){
$bildinfos=getimagesize($pfadzumbild);
$bildtypnr=$bildinfos[2];

$contenttype[1]='image/gif';
$contenttype[2]='image/jpeg';
$contenttype[3]='image/png';

header("Content-Type: $contenttype[$bildtypnr]");
readfile($pfadzumbild);}
else{}

?>

  1. Hi,

    Das ganze sollte nur auch mit pdf, doc, ppt usw. funzen. Hat jemand ne Idee??

    wie es "funzen" kann weiß ich nicht, wohl aber wie es funktionieren kann: nämlich ganz genau so wie bei Bildern. Der Content-Type muss stimmen, anschließend werden nur noch die Daten verschickt.

    $bildinfos=getimagesize($pfadzumbild);

    Welch Zweckes ist dies?

    Cheatah

    --
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Fabienne,

    Willkommen zurueck:-)

    Ein Hinweis auf den alten Thread
    </archiv/2003/11/62399/>
    kann nichts schaden. Dann ist der Hintergrund Deines Vorhabens
    mal geklaert...

    Gibt es eine Möglichkeit nicht nur Bilder via "Bildschleuse" an den Client zu schicken?

    Ja, natuerlich.

    Der $pfadzumbild wird an die Datei Bildschleuse übergeben,

    Wie ich dort schon schrieb (und wie mein Beispiel es auch tut)
    sollte man eben nicht den Pfad ans Skript uebergeben,
    sondern nur einen Parameter, z.B. eine Zahl.
    Den Pfad ungeprueft zu uebernehmen, ist ein grobfahrlaessiges
    Sicherheitsrisiko.
    Entferne zumindest saemtliche Slashes und Backslashes
    aus dem Pfad, falls Du es trotzdem tust.

    danach wird ein Usercheck durchgeführ und anschließend soll die Bilddatei aus einem Ordner, der sich nicht auf dem http-Server befindet, an den Client geschickt werden.

    Das ganze sollte nur auch mit pdf, doc, ppt usw. funzen. Hat jemand ne Idee??

    Du musst einfach den korrekten Content-Type anhand der
    Dateiendigung bestimmen.
    http://selfhtml.teamone.de/diverses/mimetypen.htm

    Fuer die Bilder wuerde ich wie bisher den Typ mit
    getimagesize() bestimmen.
    Das hat den Vorteil, dass auch Dateien mit falscher
    Endigung, z.B. GIF-Dateien, die als *.JPEG gespeichert
    sind, mit dem richtigen MIME-Type ausgeliefert werden.

    Wie bisher also...

    $bildinfos=getimagesize($pfadzumbild);
    $bildtypnr=$bildinfos[2];
    $contenttype[1]='image/gif';
    $contenttype[2]='image/jpeg';
    $contenttype[3]='image/png';

    /* Neu weiter: */
    $contenttypedatei="";
    $contenttypedatei=$contenttype[$bildtypnr];
    /* Falls es eine Bilddatei ist, ist $contenttypdatei
      jetzt gesetzt. Fuer die uebrigen Dateitypen geht es
      jetzt noch weiter, z.B. mit einer SWITCH/CASE Struktur: */

    if ($contenttypedatei=="") // d.h. wenn noch nicht gesetzt:
     /* Versuchen, den Dateityp anhand der Endigung zu erraten: */
     {
      $endigung=strtolower(strrchr($pfadzumbild,"."));
        // alles ab dem letzten Punkt
      switch ($endigung)
      case ".html":
        $contenttypedatei="text/html";
        break;
      case ".txt":
        $contenttypedatei="text/plain";
        break;
      case ".doc":
        $contenttypedatei="application/msword";
        break;
      case ".pdf":
        $contenttypedatei="application/pdf";
        break;
      /* u.s.w. */
      default:
        $contenttypedatei="application/octet-stream";
        break;
     }

    header("Content-Type: $contenttypedatei");
    readfile($pfadzumbild);}

    ---

    Alternativ zur SWITCH/CASE-Struktur koennte man
    natuerlich auch hier einen Array nehmen:
    $contenttype[".html"]="text/html";
    $contenttype[".txt"]="text/plain";
    $contenttype[".doc"]="application/msword";
    /* u.s.w. */

    Dann:
    if ($contenttypedatei=="")
     /* Versuchen, den Dateityp anhand der Endigung zu erraten: */
     {
      $endigung=strtolower(strrchr($pfadzumbild,"."));
      $contenttypedatei=$contenttype[$endigung];
      if ($contenttypedatei=="") // d.h. wenn keine Zuordnung moeglich war:
        { $contenttypedatei="application/octet-stream"; }
     }

    header("Content-Type: $contenttypedatei");
    readfile($pfadzumbild);}

    Alles ungetestet, aber probier's doch mal aus!

    Gruesse,

    Thomas