XSendFile in XAMPP aktivieren
Manchmal ist es notwendig eine Datei direkt aus der Programmlogik einer PHP Methode heraus zu versenden. Beispielsweise lässt sich so ein Rechtesystem auf Benutzer der Webseite abwickeln.
Hierbei steht man häufig vor dem Problem, dass bereits ein HEADER an den Client gesendet wurde und somit die Dateiausgabe über die normale header() Funktion scheitert. Abhilfe schafft das Apache Modul XSendFile.
Auf der Herstellerseite findet sich eine Hilfe zur Installation auf Linux-Systemen, der lokale XAMPP-Server auf Windowsmaschienen geht dabei leider leer aus.
Wie dieses Modul manuell installiert wird, erkläre ich in diesem Artikel.
Bezugsquelle
DieWin32 Binaries findet man auf https://tn123.org/mod_xsendfile/ unter Downloads. Entpackt man das Zip Archiv findet man neben dem Quellcode auch den Ordner 22. 22 steht dabei für die Apache Version 2.2 die sich in den heutigen XAMPP-Paketen wiederfindet. Wir benötigen die darin enthaltene Datei: mod_xsendfile.so
Installation
Wir kopieren die Datei mod_xsendfile.so in unser XAMPP-Verzeichnis unter apache/modules/
Damit das Modul geladen werden kann müssen wir ein paar Einstellungen im Apache Webserver vornehmen:
Wir bearbeiten die Datei apache/conf/httpd.conf:
Im Abschnitt, in dem die LoadModule Optionen ausgeführt werden, ergänzen wir folgende Zeile:
LoadModule xsendfile_module modules/mod_xsendfile.so
Wer XSendFile global für alle Projekte auf seinem XAMPP aktivieren möchte, kann direkt darunter folgende Zeilen schreiben:
# enable xsendfile
XSendFile On
Alle anderen können diese Option in den jeweilige Vhost Konfiguration verschieben.
XSendFile benötig allerdings noch eine weitere Option um sicher arbeiten zu können. Wir erstellen entweder eine .htaccess Datei im Verzeichnis unseres Projektes, oder erweitern die Vhost-Konfiguration um diese Einstellung:
XSendFilePath "/xampp/htdocs/projektverzeichnis"
XSendFilePath legt fest, welches das höchste Verzeichnis ist aus dem eine Datei gesendet werden darf! Dies stellt sicher, dass z.B. keine Datenbank-/Konfigurations- oder gar Systemdateien an den Nutzer gesendet werden.
Übrigens erzeugt eine Verletzung dieser Einstellung einen Eintrag im error-log. Dies kann sich bei der Fehlersuche als nützlich erweisen.
Verwendung
Wie bereits erwähnt erlaubt XSendFile das direkte und bequeme versenden von Dateien aus dem Programmfluss heraus, ein Beispiel findet Ihr auf der Herstellerseite.
if ($user->isLoggedIn()){
header("X-Sendfile: $path_to_somefile");
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$somefile\"");
exit;
}
Das Yii Framework sellt sogar eigene Methoden zur Verwendung von XSendFile bereit: XSendFile mit Yii
Yii::app()->request->xSendFile(
'/home/user/Pictures/picture1.jpg',
array(
'saveName'=>'RequestedFile.jpg',
'mimeType'=>'image/jpeg',
'terminate'=>false,
)
); Aktualisiert (Mittwoch, den 04. Januar 2012 um 16:11 Uhr)