我有下载文件的脚本,如pdf等.... 有一段时间,当我点击下载链接工作并下载文件时,有时我点击链接下载它会给出错误“headers_sent = false”。我试过php.ini中的“off”“buffer_output”和“on”但同样的问题。在我的标题设置之前也尝试了“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.';
}
?>
答案 0 :(得分:0)
header()函数应该在任何输出命令之前。请尝试删除var_dump和echo。
来自http://php.net/manual/en/function.header.php:
请记住,在发送任何实际输出之前,必须通过普通HTML标记,文件中的空行或PHP来调用header()。使用include或require,函数或其他文件访问函数读取代码是一个非常常见的错误,并且在调用header()之前输出空格或空行。使用单个PHP / HTML文件时存在同样的问题。
编辑:还要检查程序是否在到达header()输出之前死亡!如果您的mysql连接的无效ID失败,则会发生这种情况。通常,最好使用除die之外的方式处理此类情况(例如,将错误记录到文件中)。
编辑2:如果浏览器显示$row['name']
具有正确文件路径的垃圾检查