标头未发送到用户浏览器进行下载


headers not being sent the user browser for downloading.

我有下载pdf等文件的脚本。。。。有些时候,当我点击下载它的链接时,工作并下载文件,有些时候,我点击下载链接时,会出现错误"header_sent=false"。我在php.ini中尝试了"关闭"buffer_output"answers"打开",但问题相同。在设置标题之前也尝试过"ob_end_clean",但没有成功。这里的问题头没有发送到用户浏览器,我不知道为什么。

我的php代码。

<?php
ob_start();
error_reporting(E_ALL);
$company =$_GET['company']; 
if(isset($_GET['id']))
{
$id = intval($_GET['id']);
if($id <= 0)
{
die('The ID is invalid!');
}
else
{
$dbLink = new mysqli('localhost', 'sqldata', 'sqldata', 'balhaf');
if(mysqli_connect_errno())
{
die("MySQL connection failed: ". mysqli_connect_error());
}
$query = "SELECT mime, name, size, data FROM $company WHERE id = $id";
$result = $dbLink->query($query);
if($result)
{
if($result->num_rows == 1) {
$row = mysqli_fetch_assoc($result);
if( headers_sent() )
{
die('Headers Sent');
}
else
{
echo "error";
}
var_dump(headers_sent());
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Cache-Control: ");
header("Pragma: ");
header("Content-Type: ". $row['mime']);
header("Content-Disposition: attachment; filename=". $row['name']);
header("Content-Length: ".$row['size']);
header('Expires: 0');
header('Accept-Ranges: bytes');
header("Cache-control: private");
header('Pragma: private');

echo $row['data'];
exit;
}
else {
echo 'Error! No image exists with that ID.';
}
@mysqli_free_result($result);
}
else
{
echo "Error! Query failed: <pre>{$dbLink->error}</pre>";
}
@mysqli_close($dbLink);
}
}
else
{
echo 'Error! No ID was passed.';
}
?>

header()函数应该在任何输出命令之前。请尝试删除var_dump和echo。

发件人http://php.net/manual/en/function.header.php:

请记住,在发送任何实际输出之前,必须调用header(),无论是通过普通的HTML标记、文件中的空行还是从PHP发送。使用include或require函数或其他文件访问函数读取代码,并且在调用header()之前输出空格或空行,这是一种非常常见的错误。使用单个PHP/HTML文件时也存在同样的问题。

编辑:还要检查程序是否在到达header()输出之前死亡!如果您有一个无效的mysql连接id失败,就会发生这种情况。通常,最好用死亡以外的方式处理此类情况(例如,将错误记录到文件中)。

编辑2:如果浏览器显示垃圾检查$row['name']是否具有正确的文件路径