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
Weil Aufrufen das falsche Wort ist. Du willst die andere Datei includen
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
dann musst du ausgaben vorher puffern, header ausgeben und dann den output
Du könntest die Ausgabe puffern: Schau dir ob_start() an.
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...
spdy läuft meines Wissens nur mit Chrome und evtl. Firefox. Leider gibt es aber noch recht viele Nutzer anderer "Browser". :)
Man kann einfach eine HTML Seite ausgeben, welche einen versteckten iFrame enthält welcher auf den Download verweist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.