Header: In neuer Seite senden

Wolfsbein

Erfahrenes Mitglied
Hallo
kann ich mit einem Script eine Datei dynamisch erzeugen und dann per header() in einem neuen Fenster automatisch zum download ausgeben?
Bei einem Link wäre das mit target="_blank" zu machen, aber geht es so auch?
EDIT: ich möchte die Datei eigentlich nicht auf dem Server zwischenspeichern.
 
hi!

hier ein beispiel-codesnipplet, wie man eine datei, die auf einem server liegt, als download dem browser übergibt:

PHP:
    $file = "/Pfad/zur/dat.ei";
    $file_name = "so_soll_ich_heis.sen";

    $fp = fopen($file,"rb"); fseek($fp,0,SEEK_END);
    $size = ftell($fp); rewind($fp);
    $stream =  fread($fp,$size); 
    fclose($fp);

    $disposition = "attachment";
    $type = "application/octet-stream";

    Header("Content-Type: ". $type ."; name=\"". $file_name ."\"\r\n");
    Header("Content-Length: ". $size ."\r\n");
    Header("Content-Disposition: ". $disposition ."; filename=\"". $file_name ."\"\r\n");

    echo($stream);

zu beachten ist, dass $type eigentlich dem wirklichem typ der datei entsprechen sollte. aber so geht's theoretisch und etwas unschön auch.

matt
 
Wie man die Datei ausgibt ist mir schon klar. Meine Frage, war aber, wie ich auf einer Seite HTML ausgeben kann und in einem neuen Fenster den Download starten lasse. Nach Möglichkeit per Header.
 
ach so...

hm, eine lösung dafür wäre, dass du deine html-seite generierst und in dieser einen meta-refresh einbaust, der dich an eine weitere php-seite weiterleitet, die ausschließlich die datei zum download anbietet. per metarefresh geht aber keine neue seite auf. das könntest du aber widerrum mit JavaScript hinbekommen, dann natürlich ohne metarefresh.

eine HTML-datei ausgeben und einen download im gleichem "zug" starten geht nicht, denn du kannst der ausgabe nur einen typ "zuweisen", damit der browser erkennt, was damit gemacht werden soll.

mal eine frage an dich: hast du ne ahnung, wie ich den mime-type einer datei rausbekomme, wenn ich php nicht mit der option --with-mime-magic kompiliert habe und mir somit die funktion mime_content_type() nicht zur verfügung steht?

matt
 
Original geschrieben von matt
...mal eine frage an dich: hast du ne ahnung, wie ich den mime-type einer datei rausbekomme, wenn ich php nicht mit der option --with-mime-magic kompiliert habe und mir somit die funktion mime_content_type() nicht zur verfügung steht?...
Schwierig. Du könntest per exec() mit head den Header der Datei auslesen und versuchen darüber was rauszufinden.
EDIT: Ich habe es jetzt anders gemacht. Und zwar habe ich das target="_blank" einfach in das Formular geschrieben. Es war so einfach, dass ich nicht draufgekommen bin :(.
 
Zuletzt bearbeitet:
So jetzt bin ich es nochmal.
PHP:
header("Content-type: text/csv \r\n");
header("Content-Length: ". sizeof($strCSV) ."\r\n");
header("Content-Disposition: inline; filename=\"Ver_".$_POST['com'].".csv\" \r\n");

echo $strCSV;
Der Speicherndialog wird korrekt angezeigt. Aber auf der Platte wird keine Datei erzeugt. Und wenn ich die Datei gleich mit dem Editor öffnen möchte, passiert auch nichts. Fehlt was? Btw: die Variable ist natürlich richtig.
 
hi!

kann ich dir leider nicht genau sagen. mir ist lediglich aufgefallen, dass du die datei als inline und nicht als attachment ausgibst. vielleicht ist das der fehler?

matt
 
Der gleiche Code funktioniert mittlerweile. Keine Ahnung woran es lag. Und inline nehme, da ich so afiak einen Fehler im IE umgehen kann?
 
die datei als attachment ausgeben ist auch im IE kein problem. hab's eben nochmal getestet. funktioniert sowohl im mozilla als auch im IE einwandfrei.

gruß,
matt
 
Zurück