0

我有用于下载 pdf 等文件的脚本。有时,当我单击链接以下载文件并下载文件时,有时当我单击链接下载文件时,会出现错误“headers_sent = false”。我在 php.ini 中尝试“关闭”“buffer_output”并“打开”它,但同样的问题。在我的标题设置之前也尝试了“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.';
}
?>
4

1 回答 1

0

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']具有正确文件路径的垃圾检查

于 2013-09-01T23:05:34.780 回答