Forum: PC-Programmierung PHP Datei aus anderer Datei heraus aufrufen (Header.)


von Steffen (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Weil Aufrufen das falsche Wort ist.

Du willst die andere Datei includen

von Stryker (Gast)


Lesenswert?

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!

von Steffen (Gast)


Lesenswert?

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

von D. I. (Gast)


Lesenswert?

dann musst du ausgaben vorher puffern, header ausgeben und dann den 
output

von Nico S. (nico22)


Lesenswert?

Du könntest die Ausgabe puffern: Schau dir ob_start() an.

von Robert R. (auza)


Lesenswert?

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. ;)

von Gunther (Gast)


Lesenswert?

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

von Robert R. (auza)


Lesenswert?

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?

von Gunther (Gast)


Lesenswert?

Ö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...

von Robert R. (auza)


Lesenswert?

spdy läuft meines Wissens nur mit Chrome und evtl. Firefox. Leider gibt 
es aber noch recht viele Nutzer anderer "Browser". :)

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.