0

我发现 Headers 是一场噩梦,让我头晕目眩,我有一个用户下载的文件,它运行良好。但是,我希望在屏幕上回显已发送 xx 文件;但是ofc这个回声只是放在发送的文件中。

完整下载代码如下:

    function download()
{
$orderNo = $_POST['orderNo'];
$lines = file('F:/xamptest/htdocs/UniProject/upload/Amazon output.txt');
$lineCount = count($lines);
if($orderNo>0&&$orderNo<=$lineCount)
{
    $lineEx = explode("\t", $lines[($orderNo-1)]);      
    $file = fopen('Order.txt', 'w');
fwrite($file, $lineEx[8].PHP_EOL .$lineEx[17].PHP_EOL .$lineEx[18].PHP_EOL  .$lineEx[19].PHP_EOL  .$lineEx[20].PHP_EOL  .$lineEx[21].PHP_EOL  .$lineEx[22].PHP_EOL  .$lineEx[23].PHP_EOL);
fclose($file);
$file = 'Order.txt';

ob_end_clean();
header("Cache-Control: private");
header("Content-Description: File Transfer");
header("Content-Disposition: attachment; filename=$file");
header("Content-Type: application/zip");
header("Content-Transfer-Encoding: binary");
readfile($file);
echo "Current order, number: ".$orderNo."<br> Has been downloaded";
}
else
{
echo "Please enter a valid Order Number between 1 and ".$lineCount;
}
}

我似乎无法找到如何在不使用 exit(); 的情况下停止标题。这仍然意味着它不会显示回声,并且不再使用 ob_end_clean(); 以任何其他方式导致发送的文件为空。我能想到的唯一另一件事是在它自己的函数中有回显,但是当它同时运行时,标题仍然会将它放在文件中。

非常感谢您的帮助 - 汤姆。

4

1 回答 1

0

您正在处理的是一个HTTP 请求。浏览器通过 HTTP 请求请求URL,服务器发送响应。单击链接 → 浏览器发送请求 → 服务器发送 HTML 页面作为响应。使用 Chrome、Safari 或 Firefox + Firebug,并在他们的 Web Inspector/开发工具中使用网络选项卡,以真正了解正在发生的事情。

如果你想下载一个文件,它的工作方式是一样的。只有服务器通过 HTTP 标头告诉浏览器这个响应不是一个普通的 HTML 页面,而是应该是一个应该保存在磁盘上的文件。

如您所见,无法在一个响应中同时响应文件下载HTML 页面。根本没有办法做到这一点。您必须先输出带有消息的 HTML 页面,然后从那里链接到文件下载。

于 2013-11-04T17:49:06.480 回答