Php 将文件从服务器下载到客户端

Php 将文件从服务器下载到客户端,php,download,Php,Download,我已经看到了很多答案,这些答案似乎可以回答这个问题,尽管它们似乎对我不起作用。所有答案都使用readfile(),这应该会显示一个下载框,尽管对我来说它总是在控制台中打印。 这是我的代码 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header("Content-Transfer-Encoding: Binary");

我已经看到了很多答案,这些答案似乎可以回答这个问题,尽管它们似乎对我不起作用。所有答案都使用readfile(),这应该会显示一个下载框,尽管对我来说它总是在控制台中打印。 这是我的代码

    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header("Content-Transfer-Encoding: Binary");
    header('Content-Disposition: attachment; filename="\\'.basename($path).'\"');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($path));       
    readfile($path);
这段代码取自php readfile文档和大量堆栈溢出问题,这些问题的答案都是这样的。此外,该文件保存在webroot之外,尽管路径已正确生成,而且据我所知,它已正确到达webroot,因为它在控制台窗口中打印内容


我调用php文件的方式也是使用ajax从js文件中调用的。

要展开CBroe的评论:

如果将浏览器指向下载URL,则浏览器应正确解释下载标题并显示下载对话框。当Javascript在后台查询此URL时,不会发生这种情况


在不重定向用户浏览器位置的情况下显示下载对话框的一种方法是将下载URL加载到页面上的iFrame中。

“我调用php文件的方式也是使用ajax从js文件中调用的”。。。这就是你的问题。。。您不能从后台请求触发下载对话框;当您将当前页面“重定向”到触发AFAIK下载对话框的资源时,所有现代浏览器都会继续显示当前页面。因此,对于GET请求,一个简单的
location.href=…
就可以了;如果需要通过POST请求触发下载,那么可以使用通过JS提交的表单。