回调阻塞头函数被调用

时间:2016-09-30 15:27:40

标签: php angularjs http-headers

在我的主要php文件中,我拿一个数组并将其传递给客户端,我正在使用角度。这就是我的回应...

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

现在在我的角度控制器中,我通过GET请求获取此数据...

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

我的index.php中有一个下载按钮,点击后,控制器会获取此数据并向我的submit.php文件发出POST请求,将数组发送到此文件...

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

将数组转换为字符串,然后写入文件。到此为止,一切正常。但最后一块代码从未被调用过......

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\"");

我正在尝试强制下载,但会忽略标头功能。我认为这是由于上面第一段代码中的初始echo语句。

我该如何解决这个问题?如何防止echo语句取消标头功能?我是否需要重定向页面或其他内容?

1 个答案:

答案 0 :(得分:1)

  

请记住,在任何实际输出之前必须调用header()   通过普通HTML标记,文件中的空行或PHP发送。

来自PHP doc

脚本不能为header()的调用成功生成任何输出,并且该标题行实际上会发送给客户端代理。

你不能“阻止回声消除标题”。标题必须位于响应主体之前,而回声是主体的一部分。在您的情况下,{<1}}(以及任何其他输出)应在最后一个echo json_encode($response);语句后生成