2016-09-30 3 views
1

In meiner Haupt-php-Datei, nehme ich ein Array und übergeben Sie es an den Client, ich benutze eckig. Das ist, was mir Echo ...Echo Blocking Header-Funktion aus aufgerufen werden

header('Content-Type: application/json'); 
echo json_encode($response); //array passed to client 

Jetzt in meinem Winkel Controller ich diese Daten über GET-Anfrage nehme ...

$http.get("../server.php").success(function(data) { 
    $scope.names = data; 
}); 

ich eine Download-Button habe in meinem index.php, wenn darauf geklickt nimmt der Controller diese Daten und eine POST-Anfrage an meine submit.php Datei machen, um das Array zu dieser Datei zu senden ...

$postdata = file_get_contents("php://input"); 
$request = json_decode($postdata); 

//array converted to a string called $template  

$contentFile = fopen("file.txt", "w"); 
fwrite($contentFile, $template); 
fclose($contentFile); 

das Array in einen String umgewandelt wird dann geschrieben zehn zur Datei. Bis hier funktioniert alles. Aber der letzte Teil des Codes wird nie aufgerufen ...

header('Pragma: anytextexeptno-cache', true); 
header("Pragma: public"); 
header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private", false); 
header("Content-Type: text/plain"); 
header("Content-Disposition: attachment; filename=\"file.txt\""); 

Ich versuche, einen Download zu erzwingen, aber die Header-Funktionen werden ignoriert. Ich denke, das liegt an der ursprünglichen echo Erklärung im ersten Code-Auszug oben.

Wie kann ich das beheben? Wie kann ich verhindern, dass die Echo-Anweisung die Header-Funktion aufhebt? Muss ich die Seite oder etwas umleiten?

Antwort

1

Denken Sie daran, dass die header() muss aufgerufen werden, bevor eine Ausgabe gesendet, entweder durch normale HTML-Tags, leere Zeilen in einer Datei oder von PHP ist.

Von PHP doc

Das Skript keine Ausgabe für einen Anruf zu header() produzieren muß um erfolgreich zu sein und dass die Header-Zeile tatsächlich an den Client-Agenten gesendet werden.

Sie können nicht verhindern, dass das Echo die Kopfzeile löscht. Header müssen dem Körper einer Antwort vorangehen und Echo ist Teil des Körpers. In Ihrem Fall sollte echo json_encode($response); (und jede andere Ausgabe) produziert werden nach die letzte header() Anweisung.

+0

Aber wenn ich es vor der Echo-Anweisung setzen, wird der Force-Download nie aufgerufen, weil ich das Array zu eckigen Echo und dann an das Skript übergeben muss, das eine Datei erstellt und ermöglicht dem Benutzer, die Datei herunterzuladen. Ich denke, wenn ich es vor das Echo-Statement stelle, gäbe es nichts zum Herunterladen, nur eine leere Datei – Bolboa