Thomas Luethi: "Bildschleuse" für pdf, doc, ppt ???

Beitrag lesen

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