"Bildschleuse" für pdf, doc, ppt ???
Fabienne
- php
0 Cheatah0 Thomas Luethi
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{}
?>
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
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