Hallo zusammen,
ich schreibe gerade ein Skript, mit dem ich einige Daten verarbeite.
Diese Daten speichere ich dann in einer Textdatei. Bis hierhin läuft
alles prima.
Ich möchte nun im nächsten Schritt, dass die Datei automatisch zum
Download angeboten wird. Dieses mache ich mit "header('Content-type:
application..." usw. Nun habe ich das Problem, dass ich immer die
Fehlermeldung "headers already sent by..." bekomme. Das ist klar, da ich
ja schon vor dem header Ausgaben habe. Ich wollte nun die Sache mit dem
Download, also das "header('Content-type: application..." in eine
separate Datei schreiben (down.php) und diese aus der Datei heraus
ausrufen, in der die Daten verarbeitet und in der Textdatei gepeichert
wurden. (action.php)
Meine Frage wäre nun, wie ich die down.php aus der action.php heruas
aufrufen kann. Irgendwie finde ich da keine rechte Lösung, um die Header
korrekt senden zu können, also als erstes vor jeglicher Ausgabe.
Wäre klasse, wenn mur da jemand weiterhelfen könnte.
Vielen Dank.
Beste Grüße
Steffen
Einen Header sendet man VOR allem anderen... das heißt, sobald irgend
ein anderer Code an den Browser gesendet wird muss du diesen bereits
gesendet haben. Es gibt da unter Windows jedoch noch eine Sache die
manchmal einen zur Verzweiflung bringt, wenn man es nicht weiß: php
Dateien die als UTF8 gespeichert werden haben zu Beginn in der Datei das
BOM Zeichen gespeichert. Dieses wird von PHP als Html angesehen und
sofort gesendet - das macht ein Header setzen dann natürlich unmöglich.
Abhilfe mit einem gescheiten Editor (z.B. Notepad++ die Datei als UTF8
ohne BOM abspeichern).
Aufrufen kannst du die down.php auf 2 verschiedene Arten:
a) die down.php generiert dir den Download: einfach einen Link darauf
setzen. Ggf. den Dateinamen noch in den Header schreiben
b) die down.php includen: Hier ist aber darauf zu achten, dass bisher
noch keine Zeichen gesendet worden sind - es wird einfach an der Stelle,
wo du include('down.php') schreibst der Code der Datei eingefügt.
Die Doku von php beschreibt noch einiges mehr:
http://de2.php.net/manual/de/function.include.php
Dort ist auch der "Siehe auch" Abschnitt zu empfehlen.
Viel Erfolg!
Hallo,
warum das so ist, weiß ich. Das Problem ist ja nur, ich verarbeite Daten
ohne Ende, erstelle eine Textdatei test.txt, gebe schon einige Daten
vorher auf dem Bldschirm aus und nach den ganzen Ausgaben und der
Verarbeitung, soll die Datei dann zum Download angeboten werden. Wie
kann ich da die ganze Sache, also die Header vor den ganzen Ausgaben und
der Datenverarbeitung senden, denn die Daten der Textdatei werden ja
erst nach und nach verarbeitet und in die Datei geschrieben.
An einen Link hatte ich auch schon gedacht, aber ich würde das gerne
halt so lösen, dass der Download ohne "Umwege" also ohne einen weiteren
Klick angeboten wird, wenn es irgendwie geht.
Beste Grüße
Steffen
Also wenn ich es Richtig verstanden habe, möchtest Du mit einem Script
erst Daten an den Browser senden, die dieser anzeigen soll und dann noch
eine Datei hinterher?
Das würde meines Wissens nicht funktionieren, da der Browser sein
Verhalten ja nach dem übermittelten Header richtet. Wenn Du ihm
Mitteilst, dass Du jetzt z.B. html-Content übermittelst, wird er
versuchen den Content zu parsen. Wenn Du ihm mitteilst, dass nun eine
Datei gesendet wird, wir er versuchen, diese zu behandeln oder eben zu
speichern.
Eine Einfach Lösung wäre auf der Content-Seite die Datei per Js zu
laden, hat aber den Nachteil, dass Du JS voraussetzen musst. Du könntest
den Download auch in einem extra Fenster anstoßen.
P.S. Ich lerne auch gern was dazu ... Wie sollen ob_start(),
ob_get_contents() und ob_end_clean() hier weiterhelfen? Zumal diese nur
auf einem Linux Server einwandfrei laufen, da der Apache unter Windows
meines Wissens immer Cached. ;)
Robert R. schrieb:> P.S. Ich lerne auch gern was dazu ... Wie sollen ob_start(),> ob_get_contents() und ob_end_clean() hier weiterhelfen? Zumal diese nur> auf einem Linux Server einwandfrei laufen, da der Apache unter Windows> meines Wissens immer Cached. ;)
Der Trick ist ganz einfach:
Der erste PHP-Befehl ist ob_start(). Damit wird PHP mittgeteilt, er soll
alle Ausgaben erst mal puffern, bevor er die ganzen Sachen an den Client
schickt.
Wenn man irgendwann später, nachdem man schon viel Text an an den Client
ausgegeben hat feststellt, man möchte jetzt eine Datei schicken, wird
dieser Puffer mittels ob_end_clean() einfach gelöscht. Bis zu diesem
Zeitpunkt hat der Client kein einziges Byte von PHP bekommen.
Und nun schickt man einen neuen Header oder was auch immer.
Viele Grüße,
Gunther
Danke für die Erklärung der Funktionsweise von ob_start() etc. :)
Jedoch läst sich das Problem, in "einem Rutsch" Content (angenommen
HTML) "Content-Type: text/html" und anschließend eine Datei
"Content-Type: application/octetstream" zu übertragen damit nicht lösen.
Oder täusche ich mich?
Öhm... mit php: nein. Ich glaube auch nicht, daß das Steffen möchte. So
wie ich das verstanden habe, hat Steffen das Problem, daß er schon mal
irgendwann Text schickt und dann die header nicht mehr umbiegen kann.
Wobei... Wenn Steffen natürlich gleichzeitig (ohne weiteren mouseclick,
javascript oder Ähnlichem) Text im Browser und Text zum download
ausgeben möchte, geht das mit php/http natürlich nicht. Mit spdy sollte
es gehen...