Teil von  SELFPHP   Teil von  Praxisbuch  Teil von  PHP & HTTP
Letztes Update: 16.08.2005 17:53:45


Navigation

Seite News *

Seite Startseite
Seite Über SELFPHP
Seite Werbung
Seite Kontakt
Seite Forum *
Seite Download *
Seite SELFPHP Banner *
Seite SELFPHP in Buchform
Seite Newsletter *
Seite Impressum

 
* Link führt ins Internet



 

Download




In bestimmten Fällen ist es erwünscht, das ein PHP-Skript die von ihm erzeugten Daten nicht einfach in Form einer HTML-Seite ausgibt, sondern diese an den Client sendet. Dieser sollte diese Datei, z.B. in Form einer Datei speichern oder an andere Applikationen übergeben.

Solche Fälle tauchen vorwiegend bei Anhängen (Attachments) in einem Webmail-System auf. Normalerweise wird die Ausgabe eines PHP-Skript als HTML interprertiert, welches der Browser darstellt. Damit der Browser die Datei jedoch speichert, muss die Angabe über den Typ des Dateiinhalts für doe Übertragung geändern werden. Hierfür stehen Ihnen Content-Type und Content-Disposition zur Verfügung:



header("Content-Type: application/octetstream");



Soweit nichts anderes angegeben wird, benutzt der Browser den Dateinamen des PHP-Skript aus der URL als Dateinamen zum Abspeichern.



header("Content-Disposition: attachment; filename=dateiname.ext");



Mit diesem Header wird der Dateiname auf dateiname.ext gesetzt. Sie sollten vor allem darauf achten, dass keine Quoting-Zeichen wie etwa Hochkommata vorkommen. Grund hierfür ist, dass bestimmte Browser wie der Internet Explorer sonst die Quoting-Zeichen als Teil des Dateinamens interpretieren.

Achtung: Eventuelle Pfadangaben werden übrigens ignoriert, d.h. es ist möglich den Dateinamen festzulegen, aber nicht in welches Verzeichnis die Datei gespeichert werden sollte.



Microsoft Internet Explorer Problematik

Microsoft verarbeitet die RFCs scheinbar anders als alle anderen Browser, so daß der IE 5.5nur folgenden Header versteht:



header("Content-Disposition: filename=dateiname.ext");



Über die Variable $HTTP_USER_AGENT können Sie PHP auch entscheiden lassen, welche Variante wahrscheinlich die richtige ist.



header("Content-Disposition: ".(strpos($HTTP_USER_AGENT,"MSIE 5.5")?"":"attachment;")."filename=dateiname.ext");




Nachteil der Header-Methode

Die Methode, den Dateinamen über den Header festzulegen, hat jedoch einen kleinen Nachteil: Sollte der Anwender später im Browser nicht auf den Link klickt, um dann die Datei zu speichern, sondern direkt über Save Link as speichern will, konnte noch kein Header gesendet werden, so daß der Browser den Dateinamen nicht kennt und wieder den Dateinamen des Skripts vorschlägt. Das kann nur umgangen werden, indem man dafür sorgt, daß der gewünschte Dateiname in der URL steht. Dies ist wiederum nur über Funktionen des Webservers möglich. Beim Apache sind das die Funktionen Rewrite und Redirect.

Die Erfahrung hat gezeigt, daß ein Content-Transfer-Encoding Header die ganze Sache sicherer macht, auch wenn er laut RFC 2616 nicht benutzt wird.



header("Content-Transfer-Encoding: binary");



Die meisten Browser zeigen beim Download häufig einen Fortschrittsbalken an. Dies funktioniert allerdings nur dann, wenn der Browser weiß, wie groß die Datei ist. Die Größe der Datei in Bytes wird über den Content-Length Header angegeben.



header("Content-Length: {Dateigröße}");



Zusammenfassend können wir nun folgenden Header benutzen, wenn die Ausgabe eines Skripts heruntergeladen werden soll:



<?php
// Dateityp, der immer abgespeichert wird
header("Content-Type: application/octetstream");

// Dateiname mit Sonderbehandlung des IE 5.5
header("Content-Disposition: ".(!strpos($HTTP_USER_AGENT,"MSIE 5.5")?"attachment; ":"")."filename=datei name.ext");

// Im Grunde ueberfluessig, hat sich anscheinend bewährt
header("Content-Transfer-Encoding: binary");

// Zwischenspeichern auf Proxies verhindern
header("Cache-Control: post-check=0, pre-check=0");

// Dateigröße für Downloadzeit-Berechnung
header("Content-Length: {Dateigroesse}");
?>



Hinweis: Diese Headerkombination sollte zuverlässig funktionieren. Bei der Vielzahl von Browsern, die sich nicht immer an die RFCs halten, ist jedoch nicht ausgeschlossen, daß diese Kombination angepasst werden muß.



 


Cachen Vermeiden
 






© 2001-2005 E-Mail SELFPHP - Damir Enseleit, info@selfphp.deImpressumKontakt
© 2005 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de