Der Martin: wiederholtes Absenden Formular

Beitrag lesen

Hallo,

<?php
	function makeDownload($Dateiname_Server, $Datei_Pfad, $Datei_MIME, $Dateiname_Client) 
	{
		header('X-Content-Type-Options: nosniff');			
		header("Content-Type: ".$Datei_MIME);
		header("Content-Disposition: attachment; filename=".$Dateiname_Client);
		header("Content-Length: ".filesize($Datei_Pfad.$Dateiname_Server));
		readfile($Datei_Pfad.$Dateiname_Server);
	} 
?>

readfile ist die letzte Anweisung in php, es gibt nichts mehr wie exit, also wird der HTML-Teil auch übertragen, nur vom Browser wegen Content-Length nicht berücksichtigt.

genau das wollte ich damit sagen.

Angenommen, ich würde Content-Length um den Betrag der Index.php erhöhen, dann würde diese mit ausgegeben. Allerdings durch Content-Disposition vom Browser nicht als gerendertes HTML, sondern die Quelldaten von Index.php an die Download-Datei rangehängt.

Korrekt.

Das wäre im Ergebnis so, als würde ich vor Absenden der Header eine Ausgabe tätigen, worauf ich früher auch mal reingefallen bin.

Nein, mit der ersten Ausgabe (purer HTML-Code odere PHP-Ausgaben, z.B. print oder echo) werden alle bis dahin vorgemerkten HTTP-Header gesendet. Eine später folgende header-Anweisung kann dann nicht mehr berücksichtigt werden[1]. Versucht man es trotzdem, bekommt man von PHP die Meldung Cannot modify header information - headers already sent.

Falls aus

Allerdings ein nachfolgender Redirect wurde ausgeführt, jedoch ... ein Missverständnis erwachsen sein sollte: Ich habe den Begriff Redirect für jegliche Weiterleitung über header(Location: ...) benutzt. Möglicherweise versteht Ihr darunter lediglich die Statuscode 301 und 302?

Ja. Ein HTTP-Redirect, wie du ihn beschreibst, setzt automatisch auch einen der beiden Statuscodes 301 oder 302. Einer von beiden bedeutet eine kurzzeitige Umleitung, z.B. bei Wartungsarbeiten, der andere eine dauerhafte (nur die Zuordnung kann ich mir nie merken).

Live long and pros healthy,
 Martin

--
Klein φ macht auch Mist.

  1. Es sei denn man aktiviert Output Buffering. Dabei wird die Ausgabe bis zum Schluss des Scripts in einem Puffer gesammelt und erst dann ausgegeben. ↩︎